QXmlStreamReader (Qt5):获取标签内的所有 sub-elements

QXmlStreamReader (Qt5): get all sub-elements inside a tag

我要解析的 XML 是这样的:

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

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

此外,这是一个网络 API returns,所以我 不能 硬编码标签名称("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() 您需要告诉 XML reader 通过使用 reader.readElementText() 或使用 [= 移动到下一个元素15=]() 如果该元素不是您要查找的元素。

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 class 和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)

Writes the current state of the reader. All possible valid states are supported.

The purpose of this function is to support chained processing of XML data.