J'essaie de comprendre comment QxmlstreamReader fonctionne pour une application C ++ que j'écris. Le fichier XML que je veux analyser est un grand dictionnaire avec une structure compliquée et beaucoup de caractères Unicode, donc j'ai décidé d'essayer un petit cas de test avec un document plus simple. Malheureusement, j'ai frappé un mur. Voici le fichier XML exemple:
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; }
5 Réponses :
Êtes-vous sûr que votre document est codé UTF-8? Quel éditeur avez-vous utilisé? Vérifiez comment les caractères ä ressemblent si vous affichez le fichier sans décodage. P>
Le fichier n'est pas codé UTF-8. Changez le codage en ISO-8859-1 et il analysera sans erreur.
<?xml version="1.0" encoding="iso-8859-1" ?>
Droit sur. J'ai honte que je n'ai pas pensé à ça. :(
Mais que si le codage XML n'est pas spécifié? Qxmlstreamreader suppose-t-il qu'il est UTF-8? Ie avoir ceci:
À propos du codage: comme le dit Barsmith et Hmuelner, votre fichier est probablement incorrectement codé (à moins que l'encodage ne soit perdu lors de la collée ici). Essayez de résoudre ce problème avec un éditeur de texte avancé. p>
Le problème avec votre utilisation de texte () est qu'il ne fonctionne pas comme vous l'attendez. Text () renvoie le contenu du jeton actuel s'il s'agit de caractères de type, de commentaire, de DTD ou d'entité. Votre jeton actuel est une startelement, il est donc vide. Si vous souhaitez consommer / lire le texte de la startelement actuel, utilisez LetElementtext () à la place. p>
J'ai fait plus de recherches et le codage n'est pas vide, apparaissant comme "UTF-8" si je fais un readNext () avant d'accéder à codage ().
Je réponds moi-même comme ce problème était lié à trois problèmes, dont deux ont été soulevés par les réponses.
La section de code concernée qui fonctionne comme prévu comme prévu ressemble maintenant à ceci: p>
Intéressant. Oui, readElementText () est un peu bogué en général. Elle ne fonctionne pas correctement lors de la lecture des données par incréments d'un cours d'eau où les données peuvent être incomplètes (par exemple une prise), voir bugreports.qt.nokia.com/browse/QTBUG-14661
Devrais-je éventuellement signaler cela comme un bug? Je ne sais pas si c'est que ou si c'est censé fonctionner de cette façon.
@Frankosterfeld Y a-t-il quelque chose de nouveau sur readelementtext () code>? Y a-t-il une fonction pour vérifier si cela fonctionnera ou non?
Essayez cet exemple, je viens de la copier de mon projet, cela fonctionne pour moi.