我在其他语言中看到了类似的问题,但在使用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的一部分还有其他可能性吗?
第1版:我用两个步骤解析这个xml:
- 使用QXmlStreamReader解析我期望的字段(在本例中:"path"one_answers"language")
- 使用子字符串剪切xmlToCopy字段下的文本
xmlToCopy字段下的内容是未知的,我不想读它。我只想把它复制到其他文件中。
第2版:我只想从上面的例子中提取这个:
<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);