无法读取嵌套的XML标记的属性(QXmlStreamReader)

无法读取嵌套的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()== “期限”)

+0

第一代码片段显然是错误的,因为第二次测试将不会执行 - 这是死代码。第二个片段只要嵌入到设计正确的循环中就可以工作。也就是说,直到你发布更完整的代码来重现问题,我无法确定问题出在哪里;你的第二个片段是好的,当且仅当它是其他代码的一部分是正确的。 –

这个循环是更加简洁,应该工作:

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()); 
    } 
}