[gelöst]QDom Probleme beim auslesen einer XML-Datei

Alles rund um die Programmierung mit Qt
Antworten
Sigbert
Beiträge: 8
Registriert: 4. Dezember 2006 09:36

[gelöst]QDom Probleme beim auslesen einer XML-Datei

Beitrag von Sigbert »

Hallo,
ich folgendes Problem mit dem QDom.

Ich habe eine Datei folgender Struktur:

Code: Alles auswählen

<!DOCTYPE DBS>
<Journale>
 <Journal>
   ...
 </Journal>
 <Journal>
   ...
 </Journal>
</Journale>
<Buecher>
 <Buch>
   ...
 </Buch>
 <Buch>
   ...
 </Buch>
 <Buch>
    ...
 </Buch>
</Buecher>
Wenn ich nun versuche die Journale auszulesen funktioniert das einwandfrei.
Allerdings lassen sich die Bücher nichtmehr auslesen.
Wenn die Bücher allerdings an erster Stelle in der Datei stehen, lassen sich die Bücher auslesen aber die Journale nicht.

Das auslesen versuche ich mit folgendem Code.

Code: Alles auswählen

QFile XMLDatei(Datei);
int i = 0;

if(!XMLDatei.open(QIODevice::ReadOnly))
        return false;

QDomDocument XML;
XML.setContent(&XMLDatei);

QDomNodeList Buecher = XML.elementsByTagName("Buch");
QDomNode Buch = Buecher.at(i);

while (!Buch.isNull()) 
{
  ...
  Buch = Buecher.at(i++);
}

i=0;
QDomNodeList Journale = XML.elementsByTagName("Journal");
QDomNode Journal = Journale.at(i);

while (!Journal.isNull()) 
{
  ...
  Journal = Journale.at(i++);
}
Es schaut irgentwie so aus als wäre das QDomDoc "verbraucht"... vielleicht kann mir jemand helfen.

Gruß
Sigbert
Zuletzt geändert von Sigbert am 5. Dezember 2006 16:30, insgesamt 1-mal geändert.
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag von ChMaster »

servus,
versuchs mal damit ;)

Code: Alles auswählen

QString tmpFile
tmpFile = ":/xml.xml";

QFile crnameFile( tmpFile );
crnameFile.open( QIODevice::ReadOnly );

QDomDocument doc;
doc.setContent( &crnameFile );

crnameFile.close();

QDomNode node = doc.documentElement().firstChild();	  
while ( !node.isNull() ) {
	if ( node.toElement().tagName() == "Journal" ) {
                          // mach wass ....
	} else if ( node.toElement().tagName() == "Buch" ) {
                          // mach wass ....
	}
	node = node.nextSibling();
    }
}
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
Sigbert
Beiträge: 8
Registriert: 4. Dezember 2006 09:36

Beitrag von Sigbert »

Produziert leider den selben Fehler. Die einen werden ausgelesen die andern nicht.
Sigbert
Beiträge: 8
Registriert: 4. Dezember 2006 09:36

Beitrag von Sigbert »

Mach ich vielleicht was beim speichern falsch?

Code: Alles auswählen

      QFile XMLDatei(Datei);
      QDomDocument XML("DBS");

      if(!XMLDatei.open(QIODevice::ReadWrite))
        return false;

      QDomElement Buecher = XML.createElement("Buecher");
      XML.appendChild(Buecher);

      for(int i = 0; i < Buchliste->getElemente(); i++)
      {
        ...
        for(int j = 0; j < 9; j++)
          {
            QDomElement elem = XML.createElement(tags[j]);
            Buch.appendChild(elem);

            QDomText t = XML.createTextNode(temp[j]);
            elem.appendChild(t);
          }
        ...
      }

      QDomElement Journale = XML.createElement("Journale");
      XML.appendChild(Journale);

      for(int i = 0; i < Journalliste->getElemente(); i++)
      {
        ...
        for(int j = 0; j < 5; j++)
          {
            ...
            QDomElement elem = XML.createElement(tags[j]);
            Journal.appendChild(elem);
  
            QDomText t = XML.createTextNode(temp[j]);
            elem.appendChild(t);
          }
        ...
      }

      QTextStream out(&XMLDatei);
      out << XML;
      XMLDatei.close();
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du hast eine falsche Struktur, versuchs mal so: (Irgendwer hat mir mal erklärt warum eine XML-Struktur so aufgebaut sein muß, ich weis es aber nicht mehr)

Code: Alles auswählen

 <!DOCTYPE DBS> 
 <irgendwas>
 <Journale> 
  <Journal> 
    ... 
  </Journal> 
  <Journal> 
    ... 
  </Journal> 
 </Journale> 
 <Buecher> 
  <Buch> 
    ... 
  </Buch> 
  <Buch> 
    ... 
  </Buch> 
  <Buch> 
     ... 
  </Buch> 
 </Buecher> 
</irgendwas>
dhcase
Beiträge: 132
Registriert: 10. Juni 2006 20:38

Beitrag von dhcase »

Jupp, ein XML-Dokument darf nur ein Rootelement haben, in dem Fall von upsala trifft das zu (irgendwas). Im urspruenglichen Fall gibt es zwei Rootelemente (Journale und Buecher), das klappt nicht - kannste auch mit einem Validator ueberpruefen...
Sigbert
Beiträge: 8
Registriert: 4. Dezember 2006 09:36

Beitrag von Sigbert »

Okay, danke. Ich teste gerade daran rum.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Es sollte an der Struktur liegen. Das ist ja der Sinn von XML die Struktur. Das ganze ist wie eine Art Baum.
Sigbert
Beiträge: 8
Registriert: 4. Dezember 2006 09:36

Beitrag von Sigbert »

Es war tatsächlich nur die Struktur... seh absurd aber was solls ;) hätte ich vorher mal die XML-Definition lesen sollen.

Danke für eure Hilfe.
Antworten