0

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

4

2 回答 2

3

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

阅读器使用 namespaceUri() 和 name() 报告元素的开始。空元素也报告为 StartElement,紧随其后的是 EndElement。

但是如果定位在标记上,调用QXmlStreamReader::isEndElement()将始终返回,即使元素为空。falseStartElement

于 2016-04-07T11:28:22.997 回答
0

要回答您的问题,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()

它还有一些复杂性,这不是一个完美的解决方案,但是当我遇到这个问题时,经过一些试验后我想通了。

于 2019-07-12T12:27:47.073 回答