为什么QXmlStreamReader::isEndElement()在遇到类似<element/>
的情况时返回false?我如何识别<element/>
?
如果解析了一个空元素<element/>
,您应该会看到一个StartElement
令牌,后面紧跟着一个EndElement
令牌:
读取器使用namespaceUri()和name()。空元素也报告为StartElement,后面是直接由EndElement执行。
但是,如果位于StartElement
令牌上,调用QXmlStreamReader::isEndElement()
将始终返回false
,即使元素为空。
要回答您的问题,Qt的文档中提到了关于空元素的内容,请参阅QXmlStreamReader::StartElement一节,因此基本上是在启动后的直接endElement,但如果您尝试这样做,则不会发生这种情况。要做到这一点,你需要做到。
Qt的文档"QXmlStreamReader::readNextStartElement()"说:读取器报告具有namespaceUri()和name()的元素的开始空元素也报告为StartElement,后面紧跟EndElement可以调用便利函数readElementText()来连接所有内容,直到对应的EndElement为止。属性在Attributes()中报告,命名空间声明在namespaceDeclarations()中。
因此,请参阅Qt文档中突出显示的"QXmlStreamReader::readNextStartElement()"部分例如
<empty/>
<empty></empty>
上面是两组空标签的例子,在技术上是相同的。
所以你需要做的是调用下面的函数,这样你就可以很好地获得标签"empty"的起始元素
QXmlStreamReader::readNextStartElement()
然后,您需要调用下面的函数,该函数将带您到达指定起始元素的结束元素。
QXmlStreamReader::readElementText()
现在,如果你调用下面的函数,它会给你真正的
QXmlStreamReader::isEndElement()
它还有一些更复杂的问题,这不是一个完美的解决方案,但当我曾经面临这个问题时,经过一番尝试,我发现了这一点。