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

时间:2015-11-30 12:02:23

标签: c++ xml c++11 xml-parsing qt5

我在其他语言中看到了类似的问题,但在Qt中没有使用c ++。我只能得到一个xml数据字符串。在此字符串数据中,有多个xmls。首先给我指示,另一个我应该只复制到另一个文件。就像在这个例子中一样:

<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解析我期望的字段(在此示例中:&#34;路径&#34;和#34;语言&#34;)。
  2. 使用子字符串剪切xmlToCopy字段下的文本
  3. 字段xmlToCopy下的内容未知,我不想阅读它。我只想把它复制到其他文件。

    EDIT2: 我想从上面的例子中提取出这个:

    <someField1>
        <nest1></nest1>
        <next2></next2>
    </someField1>
    <someField2>bar</someField2>
    

    并将其保存到文件中。

2 个答案:

答案 0 :(得分:1)

所以经过一番挣扎之后,以下内容可能会给你你想要的东西:

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>"

答案 1 :(得分:0)

也许尝试QXmlStreamReader::readElementText()功能?

从文档中听起来它就像你想要的那样:

  

在读取StartElement时调用的便捷函数。读取直到相应的EndElement并返回其间的所有文本。

import requests
def myfun(url):
    response=requests.get(url)
    code=response.status_code
    if code==503:
       time.sleep(3*random.random())
       value=None
    else:
       html=response.content()
       value=html['some tag']
    return (value,code)

lists=[]
for url in [my url pool]:
     (value,code)=myfun(url)
     lists.append(value)
     if code==503:
        lists.pop()