如何将xml的一部分获取为字符串



我在其他语言中看到了类似的问题,但在使用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:

  1. 使用QXmlStreamReader解析我期望的字段(在本例中:"path"one_answers"language")
  2. 使用子字符串剪切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);

相关内容

  • 没有找到相关文章

最新更新