Warum kann ich parse eine XML-Datei mit QXmlStreamReader von Qt?
Ich versuche, herauszufinden, wie QXmlStreamReader arbeitet für eine C++ - Anwendung, die ich Schreibe. Die XML-Datei möchte ich analysieren, ist ein großes Wörterbuch mit einer komplizierten Struktur und viel Unicode-Zeichen, also habe ich beschlossen, zu versuchen, einen kleinen test mit einem einfacheren Dokument. Leider, ich traf eine Mauer. Hier ist die Beispiel-xml-Datei:
<?xml version="1.0" encoding="UTF-8" ?>
<persons>
<person>
<firstname>John</firstname>
<surname>Doe</surname>
<email>[email protected]</email>
<website>http://en.wikipedia.org/wiki/John_Doe</website>
</person>
<person>
<firstname>Jane</firstname>
<surname>Doe</surname>
<email>[email protected]</email>
<website>http://en.wikipedia.org/wiki/John_Doe</website>
</person>
<person>
<firstname>Matti</firstname>
<surname>Meikäläinen</surname>
<email>[email protected]</email>
<website>http://fi.wikipedia.org/wiki/Matti_Meikäläinen</website>
</person>
</persons>
...und ich bin versucht zu analysieren, es mit diesem code:
int main(int argc, char *argv[])
{
if (argc != 2) return 1;
QString filename(argv[1]);
QTextStream cout(stdout);
cout << "Starting... filename: " << filename << endl;
QFile file(filename);
bool open = file.open(QIODevice::ReadOnly | QIODevice::Text);
if (!open)
{
cout << "Couldn't open file" << endl;
return 1;
}
else
{
cout << "File opened OK" << endl;
}
QXmlStreamReader xml(&file);
cout << "Encoding: " << xml.documentEncoding().toString() << endl;
while (!xml.atEnd() && !xml.hasError())
{
xml.readNext();
if (xml.isStartElement())
{
cout << "element name: '" << xml.name().toString() << "'"
<< ", text: '" << xml.text().toString() << "'" << endl;
}
else if (xml.hasError())
{
cout << "XML error: " << xml.errorString() << endl;
}
else if (xml.atEnd())
{
cout << "Reached end, done" << endl;
}
}
return 0;
}
...dann bekomme ich diese Ausgabe:
C:\xmltest\Debug>xmltest.exe example.xml
Beginnend... mit dem Namen: example.xml
Datei geöffnet OK
Codierung:
XML-Fehler: Aufgetreten falsch kodierte Inhalte.
Was ist passiert? Diese Datei könnte nicht einfacher sein, und es sieht konsistent zu mir. Mit meiner original-Datei bekomme ich auch einen leeren Eintrag für die Kodierung der Einträge' names() angezeigt werden, aber leider, der text() ist auch leer. Irgendwelche Vorschläge sehr dankbar, ich persönlich bin vorher verwirrt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bin ich der Beantwortung dieser selbst als dieses problem wurde im Zusammenhang mit drei Themen, zwei von denen wurden von der gebracht Antworten.
Den entsprechenden code-Abschnitt, der funktioniert wie erwartet, sieht nun wie folgt aus:
readElementText()
? Gibt es irgendeine Funktion, um zu überprüfen, ob es funktioniert oder nicht?Die Datei ist nicht UTF-8 kodiert. Ändern Sie die Codierung auf iso-8859-1, und es wird analysiert, ohne Fehler.
<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.8/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.8/ http://www.mediawiki.org/xml/export-0.8.xsd" version="0.8" xml:lang="en">
an der Spitze der XML-Datei gibt "Aufgetreten falsch kodierte Inhalte."Über die encoding: Als baysmith und und hmuelner sagte, wird Ihre Datei wahrscheinlich falsch kodiert (es sei denn, die Codierung verloren beim einfügen gibt es hier). Versuchen Sie zu beheben, die mit einigen erweiterten text-editor.
Das problem mit Ihrer Verwendung von text() ist, dass es nicht so funktioniert wie Sie es erwarten. text() gibt den Inhalt des aktuellen Tokens, wenn Sie Zeichen eingeben, Kommentar -, DTD-oder EntityReference. Ihre aktuelle token ist ein StartElement, so ist es leer. Wenn Sie wollen, um zu konsumieren/Lesen Sie den text der aktuellen startElement, verwenden readElementText() statt.
Sind Sie sicher, dass Ihr Dokument in UTF-8 kodiert? Welchen editor hast du verwendet? Prüfen Sie, wie das ä-Zeichen Aussehen, wenn Sie die Datei anzeigen, ohne Decodierung.
Versuchen, dieses Beispiel habe ich nur kopiert von meinem Projekt und es funktioniert für mich.