我有一些我正在尝试解析的应用程序生成的XML。在这个例子中,我试图解析值&#34;值&#34;来自</element>
标签,但似乎QXmlStreamReader期望在<value/>
之后阅读某些内容,但是&#34; <value/>
&#34;正是我所追求的。
源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();
}
有人有任何建议吗?
答案 0 :(得分:0)
我可以使用Qt 5.5对此进行重新调整,但我认为这里的问题是,如果没有任何要阅读的文字,您可以使用QXmlStreamReader::readElementText()。对于元素同时是开始元素和结束元素的情况,此函数的文档为not very clear currently:
在读取StartElement时调用的便捷函数。 读取直到相应的EndElement并返回所有文本 在两者之间。如果没有错误,则使用当前令牌(请参阅tokenType()) 调用此函数后是EndElement。
当函数读取字符或时,该函数连接text() EntityReference令牌,但跳过ProcessingInstruction和Comment。 如果当前令牌不是StartElement,则返回空字符串。
该行为定义了在读取任何其他内容时会发生什么 在到达EndElement之前。该函数可以包含来自的文本 子元素(例如用于HTML),忽略子元素, 或者引发UnexpectedElementError并返回到目前为止读取的内容 (默认)。
此功能在Qt 4.6中引入。
那你做什么?我建议只使用QXmlStreamReader::text()
,它可以在您的示例代码中正常运行。
答案 1 :(得分:0)
在阅读了MrEricSir关于使用xml.text()的回答并注意到它返回了一个空白字符串后,我做了一些挖掘工作。我意识到,xml.name()在xml.readNext()之后立即进入&#34;元素&#34;返回了我要查找的内容以及空白字符串(&#39;值&#39;表示StartElement和&#39;&#39;表示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();
}