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.

Schreibe einen Kommentar