11
votes

Pourquoi ne puis-je pas analyser un fichier XML en utilisant qxmlstreamreader de qt?

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;
}


0 commentaires

5 Réponses :


2
votes

Ê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.


0 commentaires

4
votes

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" ?>


2 commentaires

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: en haut du fichier XML donne " Rencontré de contenu incorrectement codé. "



3
votes

À 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é.

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.


1 commentaires

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 ().



13
votes

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.

  1. Le fichier n'était en réalité pas codé UTF-8. J'ai changé le codage en ISO-8859-1 et l'avertissement de codage a disparu.
  2. La fonction Text () ne fonctionne pas comme on m'y attend. Je dois utiliser ReadElementtext () pour lire le contenu des entrées.
  3. Quand j'essaie de retirerEtextextextex () sur un élément qui ne contient pas de texte, comme le niveau supérieur dans mon cas, l'analyseur renvoie une donnée de caractères " " erreur et l'analyse est interrompue. Je trouve ce comportement étrange (à mon avis renversant une chaîne vide et continue serait mieux) mais je suppose que tant que la spécification est connue, je peux contourner cela et éviter d'appeler cette fonction sur chaque entrée.

    La section de code concernée qui fonctionne comme prévu comme prévu ressemble maintenant à ceci: xxx


3 commentaires

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 () ? Y a-t-il une fonction pour vérifier si cela fonctionnera ou non?



1
votes

Essayez cet exemple, je viens de la copier de mon projet, cela fonctionne pour moi. XXX


0 commentaires