我在其他语言中看到了类似的问题,但在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:
字段xmlToCopy下的内容未知,我不想阅读它。我只想把它复制到其他文件。
EDIT2: 我想从上面的例子中提取出这个:
<someField1>
<nest1></nest1>
<next2></next2>
</someField1>
<someField2>bar</someField2>
并将其保存到文件中。
答案 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()