[英]How to get part of xml as string
我在其他语言中看到了类似的问题,但在使用 c++ 的 Qt 中没有看到。 我只能得到一个字符串,它是一个 xml 数据。 在这个字符串数据中有不止一个 xml。 第一个对我有说明,另一个我应该只复制到另一个文件。 就像在这个例子中:
<response>
<path>C:/foo.xml</path>
<language>en</language>
<xmlToCopy>
<someField1>
<nest1></nest1>
<next2></next2>
</someField1>
<someField2>bar</someField2>
</xmlToCopy>
</response>
到目前为止,我一直在使用 QString 来获取以<xmlToCopy>
开头并以</xmlToCopy>
结尾的子字符串,但它非常容易出错且速度缓慢。 是否还有其他可能在特定字段之间获取 xml 的一部分?
EDIT1:我分两步解析这个xml:
xmlToCopy 字段下的内容未知,我不想阅读。 我只想将其复制到其他文件。
EDIT2:我只想从上面的例子中提取:
<someField1>
<nest1></nest1>
<next2></next2>
</someField1>
<someField2>bar</someField2>
并将其保存到文件中。
因此,经过一番挣扎之后,以下内容应该可以满足您的需求:
QByteArray xml = "<response> \n"
" <path>C:/foo.xml</path> \n"
" <language>en</language> \n"
" <xmlToCopy> \n"
" <someField1> \n"
" <nest1></nest1> \n"
" <next2></next2> \n"
" </someField1> \n"
" <someField2>bar</someField2> \n"
" </xmlToCopy> \n"
"</response> \n";
QXmlStreamReader reader(xml);
qint64 start = 0;
qint64 end = 0;
while (!reader.atEnd()) {
if(reader.isStartElement() == true) {
if(reader.name() == "xmlToCopy") {
start = reader.characterOffset();
}
}
if(reader.isEndElement() == true) {
if(reader.name() == "xmlToCopy") {
end = reader.characterOffset();
QByteArray array = xml.mid(start, end - start - QByteArray("</xmlToCopy>").size());
array = array.trimmed();
qDebug() << "XML to Copy: \n" << array;
qDebug() << "OR : \n" << array.simplified();
}
}
reader.readNext();
}
if (reader.hasError()) {
qDebug() << "error: " << reader.errorString();
}
假设您有一个QByteArray
供读者使用。
输出是:
XML to Copy:
"<someField1>
<nest1></nest1>
<next2></next2>
</someField1>
<someField2>bar</someField2>"
OR :
"<someField1> <nest1></nest1> <next2></next2> </someField1> <someField2>bar</someField2>"
也许试试QXmlStreamReader::readElementText()函数?
从文档中它听起来像你想要的:
读取 StartElement 时调用的便利函数。 读取直到对应的 EndElement 并返回其间的所有文本。
QString text = xmlReader.readElementText(QXmlStreamReader::IncludeChildElements);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.