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



我要解析的XML是这样的:

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

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

同样,这是web API返回的内容,所以I 不能硬编码标签名称(除了"post"),因为结果可能会根据调用的内容而变化。

我代码:

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();
            }
        }
    }
然而,发生的是我只得到"id"而没有其他任何东西。据我从文档中了解,这是预期的行为,但这不是我需要的。

我该怎么做才能只获得<post></post>之间的标签?

不是使用reader.text(),而是使用reader. readelementtext()告诉XML阅读器移动到下一个元素,如果该元素不是您要查找的,则使用reader. skipcurrentelement()。

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

您可以使用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的链式处理数据。

相关内容

  • 没有找到相关文章

最新更新