Tiefe Knoten einer XML-Datei auslesen + in Liste speichern

Alles rund um die Programmierung mit Qt
Antworten
mister.xy
Beiträge: 11
Registriert: 29. April 2008 11:08

Tiefe Knoten einer XML-Datei auslesen + in Liste speichern

Beitrag von mister.xy »

Hallo,

kann mir jemand sagen, wie ich mit Hilfe der DOM-API tiefe Knoten einer XML-Datei (im Code die Tags dno, pno und name) auslesen und einer Liste (QList) anhängen kann. :?:
Folgender Code ist ein Auszug aus der auszulesenden XML-Datei. Dabei ist <sd> der Tagname des obersten Elements. Die Tags <a>,<dno>, <pno> und <name> wiederholen sich.


Code: Alles auswählen

<sd>
  <as>
     <a mode="read">
        <dno>7</dno>
        <pno>283478</pno>
        <name>TEXT</name>
     </a>
  </as>
</sd>
Das Öffnen, Lesen (mit QByteArray aContent = faXML.readAll();) und Parsen (mit

Code: Alles auswählen

if(!docA.setContent(aContent,&errorMessage,&line,&column))
{
...
}
der Datei funktioniert.
Jedoch weiß ich noch nicht, wie ich die tiefen Knoten auslesen und auf den Inhalt eines jeden Tags zugreifen kann. Dieser Inhalt soll in einer Liste gespeichert werden.
Für den Zurgriff auf gewisse Tags habe ich nur mal was von einer Methode elementsByTagName( ) gehört.
Später soll auch auf jedes einzelne Listenelement zugegriffen und mit einem anderen Listenelement verglichen werden können. :roll:

Für jeden Hinweis bin ich dankbar.


Gruß
mister.xy
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Versuchs mal mit der Doku zu QDomDocument.
mister.xy
Beiträge: 11
Registriert: 29. April 2008 11:08

Tiefe Knoten einer XML-Datei auslesen + in Liste speichern

Beitrag von mister.xy »

Hallo upsala,

danke für den Hinweis.
Mit der Methode elementsByTagName( ) von der Klasse QDomDocument kann ich den Inhalt von gewissen Tags, z. B. von <depno>2</depno> die 2, auslesen.

Nun möchte ich die eingelesenen Daten in eine Liste der wie folgt definierten Struktur eintragen.
Bei der Liste handelt es sich um eine vom Typ QList:

Code: Alles auswählen

typedef struct ArtData
{
  QString depno;
  QString pno;
  QString rsd;
  QString name;
}ArtData;


typedef QList<ArtData> ArtList;
.....
.....
.....

In folgenden Methode werden 2-XML Dateien geöffnet, gelesen, geparst und die gewissen Daten(depno, pno und name) in einer Liste (ArtList artL) gespeichert.

Code: Alles auswählen

int artDataToList(const QString &sArtXML,const QString &sP2rXML,ArtList artL)
{
  ArtData artD;
  QDomDocument docArt;
   ...... 

   int indexL=0;
   while(indexL<artL.size()) // artL= Typ ArtList
   {
     QDomNodeList domListArt = docArt.elementsByTagName("depno");
     for(uint i=0;i<domListArt.length();i++)
      {
         childArtDepNo = domListArt.item(i).toElement();
         artL[ i ].depno = childArtDepNo.text();
         cout<<"["<<i<<"]"<<qPrintable(artL[ i ].depno)<<endl;
     }
    indexL++;
    articleL.append(/*ein Datensatz von Typ ArtData*/);
  }

In diesem Sourcecode-Teil soll die while()-Schleife solange laufen, bis am Ende der Liste angekommen ist. In der for()-Schleife werden wird der letztendlich der Inhalt der Tags mit der Bezeichnung depno ausgegeben.

Wenn ich jedoch die Methode in der main()-Methode die Listengröße von artL ausgebe, kommt 0 heraus. Natürlich wird vorher die Methode artDataToList() aufgerufen.
Wie gebe ich die richtige Listenngröße aus bzw. wie ermittle ich sie (Methode size() von QList?). Was muss ich tun, damit die while()-Schleife tatsächlich über die gesamte Liste geht.

Der Aufruf in der main()-Methode sieht wie folgt aus:

Code: Alles auswählen

int main()
{
  ArticleList artL;

  
  articleDataToList("art.xml","p2r.xml",artL);

  cout<<"\nGroesse von artL: "<<artL.size()<<endl;

  return 0;
}

Kann mir jemand sagen, wie die Liste richtig fülle, so dass ich in der Lage bin, auf die einzelnen Elemente zuzugreifen und gewisse Elemente miteinander zu vergleichen.

Bin für jeden Hinweis bzw. Tipp dankbar.


Gruß
mister.xy
Antworten