QXmlStreamReader读取<element> <value> </value> </element>

时间:2017-03-27 22:55:01

标签: c++ xml qt

我有一些我正在尝试解析的应用程序生成的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();
}

有人有任何建议吗?

2 个答案:

答案 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();
}