无法读取嵌套的XML标记的属性(QXmlStreamReader)
问题描述:
我有XML文件(我不得不把它简化):无法读取嵌套的XML标记的属性(QXmlStreamReader)
<Line line1_attr1 = "value1" line1_attr2 = "value2">
<Term line1_term1_attr1 = "term1value1" line1_term1_attr2 = "term1value2">
term content
</Term>
<Term line1_term2_attr1 = "term2value1" line1_term2_attr2 = "term2value2">
term content
</Term>
</Line>
<Line line2_attr1 = "value1" line2_attr2 = "value2">
<Term line2_term1_attr1 = "term1value1" line2_term1_attr2 = "term1value2">
term content
</Term>
<Term line2_term2_attr1 = "term2value1" line2_term2_attr2 = "term2value2">
term content
</Term>
</Line>
属性被存储在两个QMaps:mapString
(属性号线)和MapTerm
(Term的属性)。 我可以读取Line
标签的属性,但不能读取Term
标签的属性。 无论此
if(token == QXmlStreamReader::StartElement)
{
if (xml.name() == "Line")
{
QXmlStreamAttributes attrib = xml.attributes();
for(auto e : mapString->keys())
{
mapString->insert(e, attrib.value(e).toString());
}
continue;
if (xml.name() == "Term")
{
QXmlStreamAttributes attrib = xml.attributes();
for(auto e : mapTerm->keys())
{
mapTerm->insert(e, attrib.value(e).toString());
}
continue;
}
}
也不
if(token == QXmlStreamReader::StartElement)
{
if (xml.name() == "Line")
{
QXmlStreamAttributes attrib = xml.attributes();
for(auto e : mapString->keys())
{
mapString->insert(e, attrib.value(e).toString());
}
continue;
}
if (xml.name() == "Term")
{
QXmlStreamAttributes attrib = xml.attributes();
for(auto e : mapTerm->keys())
{
mapTerm->insert(e, attrib.value(e).toString());
}
continue;
}
工作时,内的代码,如果不执行(xml.name()== “期限”)。
答
这个循环是更加简洁,应该工作:
QXmlStreamReader xml;
...
while (!xml.atEnd()) {
xml.readNext();
if (xml.isStartElement()) {
QMap<QString, QString> * map = nullptr;
if (xml.name() == "Line") map = mapString;
else if (xml.name() == "Term") map = mapTerm;
else continue;
QXmlStreamAttributes attrib = xml.attributes();
for (auto e : map->keys())
map->insert(e, attrib.value(e).toString());
}
}
第一代码片段显然是错误的,因为第二次测试将不会执行 - 这是死代码。第二个片段只要嵌入到设计正确的循环中就可以工作。也就是说,直到你发布更完整的代码来重现问题,我无法确定问题出在哪里;你的第二个片段是好的,当且仅当它是其他代码的一部分是正确的。 –