QXmlStreamReader 阅读<element><value/></element>

QXmlStreamReader reading <element><value/></element>

本文关键字:gt lt element QXmlStreamReader value 阅读      更新时间:2023-10-16

我有一些应用程序生成的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();
}