2016-04-20 3 views
1

mein Problem ist, Ich habe eine große XML-Stil-Datei als DomDocument vertreten, und ich muss in der XML bestimmte Tags auf mehrere Standorte zugreifenC++/Qt QDomDocument iterieren XML-Tags

Meine XML wie folgt aussieht

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

Und ich muss auf alle Vorkommen von "SizeMod" und "Größe" zugreifen. Das Problem ist, dass sich das Layout der Datei in Zukunft regelmäßig ändern kann und ich meinen Code mit allen Versionen der Datei haben möchte.

Im Moment iteriere ich einfach über alle childNodes mit mehreren for-Schleifen bis ich die benötigte Tiefe erreiche und dann überprüfe ich mit einer if-Anweisung, ob ich am rechten Knoten bin.
Aber das scheint ein schlechter Weg, es zu tun.

+1

Siehe 'QDomDocument :: elementsByTagName' – hank

+0

Sie können sehen [XPath/XQuery] (http: //doc.qt. io/qt-5/xmlprocessing.html), wenn Sie bestimmte Knoten im Dokument lesen müssen. – ymoreau

Antwort

1

Wie @hank kommentierte, sollten Sie QDomDocument::elementsByTagName(const QString &tagname) verwenden, um die Elemente im Dokument mit dem Namen tagname zu erhalten.

Dann iterieren Sie über die Knoten, um jeweils QDomNode zu erhalten. Konvertieren Sie schließlich die QDomNode in eine QDomElement.

Beispiel, wo wir drucken den Text des Elements und den Tag-Namen:

#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; 
}