QXmlStreamReader(Qt5):获取标签内的所有子元素

时间:2015-08-27 15:55:03

标签: c++ qt xml-parsing qt5

我要解析的XML是这样的:

 <posts>
   <post>
     <id>1234</id>
     <file_url>/foo/bar</file_url>
   </post>
 </posts>

现在,我需要为post的每个孩子插入QVariantMap中的标记名称和内容,其中键是标记,内容(文本)是值。

此外,这是Web API返回的内容,因此我无法硬编码标记名称(除了&#34; post&#34;),因为结果可能会因调用的内容而异。< / p>

我的代码:

QXmlStreamReader reader;
reader.addData(data); // data is a QByteArray obtained from the API call
while(reader.readNextStartElement()) {
        qDebug() << reader.name();
        if (reader.name() == "post") {
            while(reader.readNextStartElement()) {
                qDebug() << reader.name() << reader.text();
            }
        }
    }

然而,我只会得到&#34; id&#34;没有别的。据我从文档中理解,这是预期的行为,但这并不是我需要的。

如何仅获取<post></post>之间的标记?

,我该怎么办?

2 个答案:

答案 0 :(得分:2)

您需要告诉XML阅读器使用reader.readElementText()或者使用reader.skipCurrentElement()来移动到下一个元素,而不是使用reader.text(),如果元素不是您正在查找的内容对

QXmlStreamReader reader;
reader.addData(data); // data is a QByteArray obtained from the API call
while(reader.readNextStartElement()) {
    qDebug() << reader.name();
    if (reader.name() == "post") {
        while(reader.readNextStartElement()) {
                qDebug() << reader.name() << reader.readElementText();
        }
    }
}

答案 1 :(得分:0)

您可以使用 QXmlStreamWriter 类和 writeCurrentToken 方法来获取输入 XML。例如以下提取直到结束 </post> 文本:

QXmlStreamReader reader;
reader.addData(data);

QString outerXml;
QXmlStreamWriter writer(&outerXml);

while (!reader.isEndElement()
       || reader.name() != "post")
{
    writer.writeCurrentToken(mXmlReader);
    reader.readNext();
}
writer.writeCurrentToken(reader);

来自 Qt 文档:

<块引用>

void QXmlStreamWriter::writeCurrentToken(const QXmlStreamReader &reader)

写入读取器的当前状态。所有可能的有效 支持状态。

这个函数的目的是支持XML的链式处理 数据。