繁体   English   中英

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

[英]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:

  1. 使用 QXmlStreamReader 解析我期望的字段(在本例中:“路径”和“语言”)。
  2. 使用子字符串剪切 xmlToCopy 字段下的文本

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM