2016-04-20 32 views
1

我的問題是, 我表示的DomDocument大型XML風格的文件,我需要訪問多個位置的某些標籤在XMLC++/QT QDomDocument遍歷所有的XML標籤

我的XML看起來像這樣

<Mat1> 
    <Name>Mat_1</Name> 
    <Properties> 
     <Size>10</Size> 
     <SizeMod>G</SizeMod> 
    </Properties> 
</Mat1> 
<Mat2> 
    <Name>Mat_2</Name> 
    <Properties> 
     <Size>15</Size> 
     <SizeMod>k</SizeMod> 
    </Properties> 
</Mat2> 

我需要訪問「SizeMod」和「Size」的所有匹配項。問題是該文件的佈局可能會在將來定期更改,並且我希望我的代碼能夠與所有版本的文件一起使用。

目前我只是遍歷所有childNodes與多個for循環,直到我達到所需的深度,然後我檢查與if語句,如果我在正確的節點。
但這似乎是一個不好的方法來做到這一點。

+1

見'QDomDocument :: elementsByTagName' – hank

+0

你可以看一下[的XPath/XQuery的(HTTP://doc.qt。 io/qt-5/xmlprocessing.html),如果您需要閱讀文檔中的特定節點。 – ymoreau

回答

1

正如@hank所評論的那樣,您應該使用QDomDocument::elementsByTagName(const QString &tagname)來獲取名稱爲tagname的文檔中的元素 。

然後,迭代節點以得到每個QDomNode。最後,將QDomNode轉換爲QDomElement

例子我們在輸出元素的文本和標籤名稱:

#include <QtXml> 
#include <QtCore> 

int main() 
{ 
    QFile file(":/myxml.xml"); 

    file.open(QFile::ReadOnly|QFile::Text); 

    QDomDocument dom; 
    QString error; 

    int line, column; 

    if(!dom.setContent(&file, &error, &line, &column)) { 
     qDebug() << "Error:" << error << "in line " << line << "column" << column; 
     return -1; 
    } 

    QDomNodeList nodes = dom.elementsByTagName("Size"); 
    for(int i = 0; i < nodes.count(); i++) 
    { 
     QDomNode elm = nodes.at(i); 
     if(elm.isElement()) 
     { 
      qDebug() << elm.toElement().tagName() 
        << " = " 
        << elm.toElement().text(); 
     } 
    } 

    nodes = dom.elementsByTagName("SizeMod"); 
    for(int i = 0; i < nodes.count(); i++) 
    { 
     QDomNode elm = nodes.at(i); 
     if(elm.isElement()) 
     { 
      qDebug() << elm.toElement().tagName() 
        << " = " 
        << elm.toElement().text(); 
     } 
    } 

    return 0; 
}