【问题标题】:QXmlStreamReader reading <element><value/></element>QXmlStreamReader 读取 <element><value/></element>
【发布时间】:2017-08-20 19:58:31
【问题描述】:

我有一些我试图解析的应用程序生成的 XML。在这个例子中,我试图从&lt;/element&gt;标签解析值“值”,但似乎QXmlStreamReader期待在&lt;value/&gt;之后读取一些东西,但“&lt;value/&gt;”正是我所追求的。

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

有人有什么建议吗?

【问题讨论】:

  • 您的 XML 格式正确。当您使用 QXmlStreamReader 时,我假设您使用的是 Qt 4.8。如果您查看the accepted answer to this question,XML 解析器的行为似乎有些奇怪?
  • xml 中的 元素没有值。那你要解析什么?此外,如果当前元素是起始元素,则必须读取值。因此,将if (xml.isStartElement()) ... 添加到您的代码中。

标签: c++ xml qt


【解决方案1】:

在阅读了 MrEricSir 关于使用 xml.text() 的回答并注意到它返回了一个空白字符串后,我做了更多的挖掘工作。我意识到,在 xml.readNext() 之后的 xml.name() 立即返回了我正在寻找的内容以及一个空白字符串(StartElement 的 'value' 和 EndElement 的 '')。这与 vah​​ancho 关于 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();
}

【讨论】:

    【解决方案2】:

    我可以使用 Qt 5.5 进行重现,但我认为这里的问题是您在没有任何文本可阅读时使用 QXmlStreamReader::readElementText()。对于元素既是开始元素又是结束元素的情况,此函数的文档为 not very clear currently

    在读取 StartElement 时调用的便利函数。 读取到对应的 EndElement 并返回所有文本 之间。在没有错误的情况下,当前令牌(参见 tokenType()) 调用此函数后为 EndElement。

    该函数在读取 Characters 或 EntityReference 标记,但跳过 ProcessingInstruction 和 Comment。 如果当前标记不是 StartElement,则返回一个空字符串。

    行为定义了读取其他内容时会发生什么 在到达 EndElement 之前。该函数可以包含来自的文本 子元素(例如对 HTML 很有用),忽略子元素, 或引发 UnexpectedElementError 并返回到目前为止读取的内容 (默认)。

    此功能是在 Qt 4.6 中引入的。

    那你是做什么的?我建议只使用QXmlStreamReader::text(),它在您的示例代码中运行良好。

    【讨论】:

    • QXmlStreamReader::text() 为我返回了一个空白字符串。但是 QXmlStreamReader::name() 在“元素”内部返回了“值”。看我的回答。
    • @ComputerEngineer88 value 元素显然没有文本。你为什么期望它返回任何东西?
    • 是的,基于您的代码的意图。我们不介意读者。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2021-12-31
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多