[Gelöst] QXmlStreamReader u. spezielles XML File?

Alles rund um die Programmierung mit Qt
Antworten
bronko
Beiträge: 40
Registriert: 19. Mai 2009 15:49

[Gelöst] QXmlStreamReader u. spezielles XML File?

Beitrag von bronko »

Hallo,

folgendes Problem:
Ich habe eine XML Datei mit folgendem Eintrag:

Code: Alles auswählen

...
<term>
  Global 
  <ref refid="abcde" kindref="member">myText</ref> 
 (void) 
  </term>
...
Ich habe:

Code: Alles auswählen

xml.readNextStartElement(); // term
qDebug() << xml.readElementText(); //"Global"
xml.readNextStartElement(); // ref
qDebug() << xml.attributes().value("refid").toString(); //abcde
qDebug()  << xml.attributes().value("kindref");//member
qDebug()  << xml.readElementText(); //""
qDebug()  << xml.errorString(); // "Expected character data."
Den Rest der Datei lese ich korrect, wenn es aber zu diesen Zeilen komme, dann sagt xml.errorString() "Expected character data."

Ich kenne mich mit XML nicht gut aus, aber ist es möglich mit QXmlStreamReader das korrekt auszulesen?
Was mache ich falsch?

Bronko
Zuletzt geändert von bronko am 6. April 2011 12:53, insgesamt 1-mal geändert.
bronko
Beiträge: 40
Registriert: 19. Mai 2009 15:49

Beitrag von bronko »

Keiner ne Idee? Weiß jemand ob das überhaupt gültiges XML ist?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Der Text "myText" ist eine eigene Node -> CDATA. Verwende nur "readNext()" und achte auf den Rückgabetyp (TokenType), zum Debuggen kannst ihn ja einfach ausgeben.
bronko
Beiträge: 40
Registriert: 19. Mai 2009 15:49

Beitrag von bronko »

Danke franzf,
hab etwas über CDATA gelesen (http://www.w3schools.com/xml/xml_cdata.asp)
Dort steht "The term CDATA is used about text data that should not be parsed by the XML parser. " :?:
Ich will es aber parsen...

Auf jedenfall habe ich das hinzugefügt

Code: Alles auswählen

xml.readNextStartElement(); // term
qDebug() << xml.readElementText(); //"Global"
xml.readNextStartElement(); // ref
qDebug() << xml.attributes().value("refid").toString(); //abcde
qDebug()  << xml.attributes().value("kindref");//member
qDebug() << "next" <<xml.readNext(); // 1 
qDebug()  << xml.readElementText(); //""
qDebug()  << xml.errorString(); // "Expected character data."
Er gibt mir immer QXmlStreamReader::Invalid zurück.
Auch an anderen Stellen. Lt. Doku müsste er abbrechen, macht er aber nicht.
Oder hast du etwas anderes gemeint?

Bronko
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

"Verwende NUR readNext()", war das nicht klar genug? Dann sieht man, in welcher Reihenfolge was wie wann kommt.
Und für sowas schreibt man sich dann ein winziges Test-Programm.

Code: Alles auswählen

#include <QXmlStreamReader>
#include <QDebug>

int main() {
    QXmlStreamReader reader("<term>Global<ref refid='abcde' kindref='member'>myText</ref>(void)</term>");
    while( !reader.atEnd() ) {
        qDebug() << "Token Type:" << reader.readNext();
        qDebug() << "Name: " << reader.name().toString();
        qDebug() << "Text:" << reader.text().toString();
    }
}
Ausgabe:

Code: Alles auswählen

Token Type: 2 
Name:  "" 
Text: "" 
Token Type: 4 
Name:  "term" 
Text: "" 
Token Type: 6 
Name:  "" 
Text: "Global" 
Token Type: 4 
Name:  "ref" 
Text: "" 
Token Type: 6 
Name:  "" 
Text: "myText" 
Token Type: 5 
Name:  "ref" 
Text: "" 
Token Type: 6 
Name:  "" 
Text: "(void)" 
Token Type: 5 
Name:  "term" 
Text: "" 
Token Type: 3 
Name:  "" 
Text: ""
Man könnte jetzt natürlich noch ausbauen mit Iteration über die attributes(), aber das ist ja nicht das Problem.
bronko
Beiträge: 40
Registriert: 19. Mai 2009 15:49

Beitrag von bronko »

Vielen Dank! Das war ein genereller Denkfehler.

Kann man generell sagen, dass es besser ist readNext() anstatt readNextStartElement() zu verwenden um den tokenType prüfen zu können?
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

bronko hat geschrieben:Vielen Dank! Das war ein genereller Denkfehler.

Kann man generell sagen, dass es besser ist readNext() anstatt readNextStartElement() zu verwenden um den tokenType prüfen zu können?
Die Doku zu den beiden Methoden kennst du?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

readNext() iteriert halt über ALLE Node-Typen, readNextStartElement() iteriert nur über XML-Elements (Also "<ref attribute="abc">").
Ersetz halt einfach readNext durch readNextStartElement() und schau was passiert. Weck den Spieltrieb in dir! :D
Antworten