QXmlStreamReader 阅读<element><value/></element>
QXmlStreamReader reading <element><value/></element>
我有一些应用程序生成的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();
}
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中