首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QXmlStreamReader阅读<元素><值/></元素>

QXmlStreamReader阅读<元素><值/></元素>
EN

Stack Overflow用户
提问于 2017-03-27 22:55:01
回答 2查看 2.3K关注 0票数 0

我有一些应用程序生成的XML,我正试图解析这些XML。在本例中,我试图解析</element>标记中的值" value“,但似乎QXmlStreamReader希望在<value/>之后读取某些内容,但"<value/>”正是我所追求的。

源XML是不正确的,还是有从QXmlStreamReader获取此值的方法?

代码语言:javascript
复制
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();
}

有人有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-28 16:32:25

在阅读了MrEricSir关于使用xml.text()的答案并注意到它返回了一个空字符串之后,我做了更多的调查。我意识到,xml.name()在xml.readNext()之后立即返回了我正在寻找的内容以及一个空字符串( StartElement的‘value’和EndElement的'‘)。由于vahancho关于if (xml.isStartElement())失踪的评论,帮助我缩小了范围,只返回了“价值”。见这里:

代码语言:javascript
复制
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();
}
票数 0
EN

Stack Overflow用户

发布于 2017-03-28 05:28:38

我可以使用QT5.5进行复制,但我认为这里的问题是,当没有任何文本可读时,您使用的是QXmlStreamReader::readElementText()。对于元素既是开始元素又是结束元素的情况,这个函数的文档是目前不太清楚

在读取StartElement时调用的方便函数。读取到相应的EndElement并返回所有介于之间的文本。如果没有错误,调用此函数后的当前令牌(请参见tokenType())是EndElement。 该函数在读取字符或EntityReference标记时连接text(),但跳过ProcessingInstruction和注释。如果当前令牌不是StartElement,则返回一个空字符串。 这种行为定义了在到达EndElement之前读取其他内容时所发生的事情。该函数可以包含来自子元素的文本(例如,对HTML有用),忽略子元素,或者引发一个UnexpectedElementError并返回到目前为止读取的内容(默认)。 这个功能是在QT4.6中引入的。

那么你是做什么的?我建议简单地使用QXmlStreamReader::text(),它在示例代码中工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43057785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档