我要解析的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的链式处理数据。