QXmlStreamReader::isEndElement() 返回错误

QXmlStreamReader::isEndElement() returning false

为什么 QXmlStreamReader::isEndElement() 在遇到类似 <element/> 的情况时返回 false,我如何识别 <element/>

如果解析空元素 <element/>,您应该 see 一个 StartElement 标记紧跟一个 EndElement 标记:

The reader reports the start of an element with namespaceUri() and name(). Empty elements are also reported as StartElement, followed directly by EndElement.

但调用 QXmlStreamReader::isEndElement() 将始终 return false 如果位于 StartElement 标记上,即使元素为空。

为了回答您的问题,Qt 的文档说 this 关于空元素,请参阅第 QXmlStreamReader::StartElement 节,所以基本上它在开始后立即结束元素,但是如果您尝试这样做,它不会发生那样。 为此,您需要做 .

Qt 的 'QXmlStreamReader::readNextStartElement()' 文档说:reader 报告了带有 namespaceUri() 和 name() 的元素的开始。 空元素也报告为 StartElement,紧跟 EndElement。 可以调用便捷函数 readElementText() 连接所有内容,直到相应的 EndElement .属性在 attributes() 中报告,命名空间声明在 namespaceDeclarations() 中。

因此请参阅 'QXmlStreamReader::readNextStartElement()' Qt 文档中突出显示的部分 例如

<empty/>
<empty></empty>

以上是你的两组空标签的例子,技术上是一样的

所以你需要做的是调用下面的函数,这样你就可以得到标签“空”的起始元素。

QXmlStreamReader::readNextStartElement()

然后你需要调用下面的函数,它将带你到指定起始元素的结束元素。

QXmlStreamReader::readElementText()

现在如果你调用下面的函数,它会给你 true

QXmlStreamReader::isEndElement()

它有一些更复杂的地方,这不是一个完美的解决方案,但我曾经遇到过这个问题,经过一些尝试后发现了它。