我有一些应用程序生成的XML,我正在尝试解析。在这个例子中,我试图从</element>
标签中解析值"value",但似乎QXmlStreamReader期望在<value/>
之后读取某些内容,但"<value/>
"正是我所追求的。
源 XML 是否不正确,或者有没有办法从 QXmlStreamReader 获取此值?
QString str = "<element><value/></element>";
QXmlStreamReader xml(str);
while (!xml.atEnd()) {
xml.readNext();
qDebug() << xml.name() << xml.readElementText();
}
if (xml.hasError()) {
// Prints "Expected character data. 17"
qDebug() << xml.errorString() << xml.characterOffset();
}
有人有什么建议吗?
我可以使用Qt 5.5重现这一点,但我认为这里的问题是您在没有任何文本可读时使用QXmlStreamReader::readElementText()。对于元素既是开始元素又是结束元素的情况,此函数的文档目前不是很清楚:
在读取 StartElement 时调用的便利函数。 读取直到相应的 EndElement 并返回所有文本 介于两者之间。如果没有错误,则为当前令牌(请参阅 tokenType()) 调用此函数后是 EndElement。
该函数在读取字符或 实体引用令牌,但跳过处理指令和注释。 如果当前令牌不是 StartElement,则返回空字符串。
该行为定义了在读取其他任何内容时会发生什么 在到达 EndElement 之前。该函数可以包含来自 子元素(例如对 HTML 很有用),忽略子元素, 或引发意外元素错误并返回到目前为止读取的内容 (默认值)。
这个函数是在Qt 4.6中引入的。
那你怎么办?我建议简单地使用QXmlStreamReader::text()
,这在您的示例代码中效果很好。
在阅读了 MrEricSir 关于使用 xml.text() 的回答并注意到它返回了一个空白字符串后,我做了更多的挖掘。我意识到,xml.name 在 "element" 中,在 xml.readNext() 之后立即返回了我正在寻找的内容以及一个空白字符串("value"表示 StartElement,"' 表示 EndElement)。随着vahancho关于if (xml.isStartElement())
缺失的评论,帮助我缩小了范围,只返回"价值"。看这里:
QString str = "<element><value/></element>";
QXmlStreamReader xml(str);
while (!xml.atEnd()) {
xml.readNext();
if (xml.name() == "element") {
xml.readNext();
if (xml.isStartElement())
qDebug() << xml.name();
}
}
if (xml.hasError()) {
qDebug() << xml.errorString() << xml.characterOffset();
}