2015-08-14 134 views
0

我有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

第一代碼片段顯然是錯誤的,因爲第二次測試將不會執行 - 這是死代碼。第二個片段只要嵌入到設計正確的循環中就可以工作。也就是說,直到你發佈更完整的代碼來重現問題,我無法確定問題出在哪裏;你的第二個片段是好的,當且僅當它是其他代碼的一部分是正確的。 –

回答

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