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.
我要解析的 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.