我有一些应用程序生成的XML,我正试图解析这些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();
}有人有什么建议吗?
发布于 2017-03-28 16:32:25
在阅读了MrEricSir关于使用xml.text()的答案并注意到它返回了一个空字符串之后,我做了更多的调查。我意识到,xml.name()在xml.readNext()之后立即返回了我正在寻找的内容以及一个空字符串( StartElement的‘value’和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();
}发布于 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(),它在示例代码中工作得很好。
https://stackoverflow.com/questions/43057785
复制相似问题