J'essaie de comprendre comment fonctionne QXmlStreamReader pour une application C++ que j'écris. Le fichier XML que je veux analyser est un grand dictionnaire avec une structure alambiquée et beaucoup de caractères Unicode. J'ai donc décidé d'essayer un petit cas de test avec un document plus simple. Malheureusement, je frappe un mur. Voici le fichier xml exemple:Pourquoi ne puis-je pas analyser un fichier XML à l'aide de QXmlStreamReader à partir de Qt?
<?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>
... et je suis en train de l'analyser en utilisant ce 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;
}
... je reçois cette sortie:
C:\xmltest\Debug>xmltest.exe example.xml
Starting... filename: example.xml
File opened OK
Encoding:
XML error: Encountered incorrectly encoded content.
Que s'est-il passé? Ce fichier ne pourrait pas être plus simple et il me semble cohérent. Avec mon fichier d'origine, je reçois également une entrée vide pour l'encodage, les noms des entrées() sont affichés, mais hélas, le texte() est également vide. Toutes les suggestions grandement appréciées, personnellement, je suis profondément mystifié. Etes-vous sûr que votre document est codé en UTF-8?
Intéressant: readElementText() est un peu bogué en général, mais ne fonctionne pas correctement lors de la lecture incrémentielle de données d'un flux où les données peuvent être incomplètes (par exemple une socket), voir http://bugreports.qt.nokia.com/browse/QTBUG-14661 –
Devrais-je signaler cela comme un bug? Je ne suis pas sûr que ce soit est-ce, ou si c'est censé fonctionner de cette façon. – neuviemeporte
@FrankOsterfeld y a-t-il quelque chose de nouveau sur 'readElementText()'? Y at-il une fonction pour vérifier si cela va fonctionner ou non? – Niklas