为什么QXmlStreamReader::isEndElement()在遇到类似的东西时返回 false,<element/>
我如何识别<element/>
?
2 回答
如果解析一个空元素<element/>
,您应该会看到一个StartElement
标记紧跟一个EndElement
标记:
阅读器使用 namespaceUri() 和 name() 报告元素的开始。空元素也报告为 StartElement,紧随其后的是 EndElement。
但是如果定位在标记上,调用QXmlStreamReader::isEndElement()
将始终返回,即使元素为空。false
StartElement
要回答您的问题,Qt 的文档说明了有关空元素的内容,请参阅 QXmlStreamReader::StartElement 部分,因此基本上它在开始后立即结束元素,但是如果您尝试这样做,它不会以这种方式发生。要实现这一点,您需要这样做。
Qt's Documentation for 'QXmlStreamReader::readNextStartElement()' 说:阅读器使用 namespaceUri() 和 name() 报告元素的开始。空元素也报告为 StartElement,紧随其后的是 EndElement。 可以调用便利函数 readElementText() 来连接所有内容,直到对应的 EndElement。属性在 attributes() 中报告,命名空间声明在 namespaceDeclarations() 中。
因此,请参阅 Qt 文档中突出显示的部分“QXmlStreamReader::readNextStartElement()”,例如
<empty/>
<empty></empty>
以上是您的两组空标签示例,在技术上是相同的。
所以你需要做的是调用下面的函数,这样你就可以得到标签“空”的起始元素。
QXmlStreamReader::readNextStartElement()
然后你需要调用下面的函数,它将带你到指定开始元素的结束元素。
QXmlStreamReader::readElementText()
现在,如果你调用下面的函数,它会给你真实的
QXmlStreamReader::isEndElement()
它还有一些复杂性,这不是一个完美的解决方案,但是当我遇到这个问题时,经过一些试验后我想通了。