Alles rund um die Programmierung mit Qt
bronko
Beiträge: 40 Registriert: 19. Mai 2009 15:49
Beitrag
von bronko » 4. April 2011 16:40
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 » 6. April 2011 08:14
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 » 6. April 2011 09:03
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 » 6. April 2011 09:54
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 » 6. April 2011 10:48
"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 » 6. April 2011 12:32
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 » 6. April 2011 12:42
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 » 6. April 2011 12:43
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!