2016-04-20 33 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; 
}