Seite 1 von 1

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

Verfasst: 4. Dezember 2006 09:45
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

Verfasst: 4. Dezember 2006 09:52
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();
    }
}

Verfasst: 4. Dezember 2006 10:09
von Sigbert
Produziert leider den selben Fehler. Die einen werden ausgelesen die andern nicht.

Verfasst: 4. Dezember 2006 10:18
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();

Verfasst: 4. Dezember 2006 15:48
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>

Verfasst: 4. Dezember 2006 17:27
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...

Verfasst: 4. Dezember 2006 19:59
von Sigbert
Okay, danke. Ich teste gerade daran rum.

Verfasst: 4. Dezember 2006 20:11
von BartSimpson
Es sollte an der Struktur liegen. Das ist ja der Sinn von XML die Struktur. Das ganze ist wie eine Art Baum.

Verfasst: 5. Dezember 2006 16:30
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.