IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

QXmlStreamReader

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut QXmlStreamReader
    Bonjour à tous, voila j'ai un soucis avec QXmlStreamReader.
    Enfin pas vraiment un soucis mais je n'arrive pas à faire ce que je veux.
    A partir de mon fichier .ui obtenu avec QtDesigner (une simple interface données patients), je souhaiterais pouvoir créer un fichier xml qui contient uniquement le nom des champs à remplir dans le formulaire.
    Voici un bref extrait du fichier pour vous donner une idée :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
        <item row="1" column="1">
         <widget class="QTextEdit" name="ContexteExamen_2">
          <property name="font">
           <font>
            <pointsize>10</pointsize>
           </font>
          </property>
         </widget>
        </item>
        <item row="4" column="0">
         <widget class="QLabel" name="TypeExamen">
          <property name="palette">
           <palette>
            <active>
             <colorrole role="Text">
              <brush brushstyle="SolidPattern">
               <color alpha="255">
                <red>255</red>
                <green>0</green>
                <blue>0</blue>
               </color>
              </brush>
             </colorrole>
            </active>
            <inactive>
             <colorrole role="Text">
              <brush brushstyle="SolidPattern">
               <color alpha="255">
                <red>255</red>
                <green>0</green>
                <blue>0</blue>
               </color>
              </brush>
             </colorrole>
            </inactive>
            <disabled>
             <colorrole role="Text">
              <brush brushstyle="SolidPattern">
               <color alpha="255">
                <red>28</red>
                <green>57</green>
                <blue>86</blue>
               </color>
              </brush>
             </colorrole>
            </disabled>
           </palette>
          </property>
          <property name="font">
           <font>
            <pointsize>10</pointsize>
           </font>
          </property>
          <property name="text">
           <string>Type d'EEG (*)</string>
          </property>
         </widget>
        </item>

    En gros ce que je souhaiterais faire, c'est prendre uniquement les widgets qui ont pour attribut class "QLabel", et ensuite extraire de ces widget la valeur de leur "string", dans mon exemple seul le 2eme widget m'interesse puisqu'il est de type QLabel, et son string serait "Type d'EEG".

    J'arrive à détecter chaque widget, et à déterminer si son attribut class est "QLabel" ou non avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    void mafenetre::lectureFormulaire()
    {
        QXmlStreamReader reader;
        QString filename="mafenetre.ui";
        QFile file(filename);
        file.open(QFile::ReadOnly | QFile::Text);
        reader.setDevice(&file);
     
        reader.readNext();
     
        while(!reader.atEnd()){
     
            reader.readNext();
     
            if(reader.isStartElement()){
     
               if(reader.name() == "widget"){
     
                   QXmlStreamAttributes attrs = reader.attributes();
                   QString tmp = attrs.value("class").toString();
     
                   if(tmp == "QLabel"){
     
                            /* ici le code à compléter ... */
     
                            }
     
                        }
     
                   }
     
                }
     
            }
     
        }
     
        file.close();
     
    }
    Ma question est donc la suivante, une fois que j'ai bien detecté que mon widget est un QLabel, comment faire pour extraire son string? Comment indiquer au reader qu'il doit extraire UNIQUEMENT les strings dont les widget sont des QLabel?

    Merci d'avance. Si ma question n'est pas claire (et je peux le concevoir) n'hésitez pas à me demander des précisions

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Hello,

    Personnellement je ferais quelque chose comme ça, par contre je n'arrive pas à obtenir le texte avec la fonction ReadElementText() depuis le QXmlStreamReader, je n'ai pas trouvé de solution à ce problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    bool isQLabel = false;
            QString labelText;
     
            while(!reader.atEnd()){
                reader.readNext();
                if(reader.isStartElement()){
                    ui->textEdit->append(reader.name().toString());
                    //ui->textEdit->append(reader.readElementText());
     
                    if(reader.name().toString() == "widget"){
                        if(reader.attributes().value("class").toString() == "QLabel"){
                            isQLabel = true;
                        } else {
                            isQLabel = false;
                        }
                    }
     
                    if(reader.name() == "string" && isQLabel){
                        //On entrera dans cette condition que si nous sommes dans la proprieté "string" 
                        //d'un "widget" de "class" "QLabel", par contre readElementText() renvoi une chaîne vide.
                        labelText == reader.readElementText(); 
                        ui->textEdit->append("<b>Label Text is :" + labelText + "</b>");
                    }
                }
            }
    Par contre ne serais-ce pas plus simple d'utiliser les classe QDomDocument, QDomElement, etc... Les désavantage est qu'il faut connaître la structure du document à l'avance, mais ce n'est pas un problème dans ce cas.

    Voici un solution qui fonctionne avec les classes QDomXxx:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
        QDomDocument doc2("mydocument");
        QFile file("mafenetre.ui");
        file.open(QIODevice::ReadOnly);
        doc2.setContent(&file);
        file.close();    
     
     
        // print out the element names of all elements that are direct children
        // of the outermost element.
        QDomElement docElem = doc2.documentElement();
     
        QDomNode n = docElem.firstChild();
        while(!n.isNull()) {
            QDomElement e = n.toElement(); // try to convert the node to an element.
            if(!e.isNull()) {                
                qDebug() << qPrintable(e.tagName()) << endl; // the node really is an element.
                QDomElement e2 = e.firstChild().toElement();
                if(!e2.isNull()){
                    qDebug() << "   " << qPrintable(e2.tagName()) << endl; // the node really is an element.
                    QString cl = e2.attribute("class", "");
                    if(cl == "QLabel"){
                        qDebug() << "This is a QLabel";
     
                        //Search "text" property
                        QDomElement e3 = e2.firstChild().toElement();
                        while(!e3.isNull()){
                            qDebug() << "   " << qPrintable(e2.tagName()) << endl; // the node really is an element.
                            qDebug() << "   " << e3.attribute("name", "");
                            if(e3.tagName() == "property" && e3.attribute("name", "") == "text"){
                                QString text = e3.firstChild().toElement().text();
                                qDebug() << "Test of QLabel is : " << text;
                            }
                            e3 = e3.nextSibling().toElement();
                        }
                    }
                }
            }
            n = n.nextSibling();
        }
    Avec ce Xml (version posté à laquelle j'ai rajouter l'élément root "<ui>" et j'ai supprimer le contenu de "<palette>" pour simplifier) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
        <item row="1" column="1">
         <widget class="QTextEdit" name="ContexteExamen_2">
          <property name="font">
           <font>
            <pointsize>10</pointsize>
           </font>
          </property>
         </widget>
        </item>
        <item row="4" column="0">
         <widget class="QLabel" name="TypeExamen">
          <property name="palette">
           <palette>        
           </palette>
          </property>
          <property name="font">
           <font>
            <pointsize>10</pointsize>
           </font>
          </property>
          <property name="text">
           <string>Type d'EEG (*)</string>
          </property>
         </widget>
        </item>
    </ui>
    J'éspère que ma réponse est claire. et désolé de ne pas avoir trouver de solution pour la lecture du texte avec la méthode utilisant le QXmlStreamReader.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Bonjour, tout d'abord merci de votre réponse.
    Pas de soucis pour le QXmlStreamReader, je me suis retourné la tête dans tous les sens et je crois que ce n'est simplement pas possible de faire ça avec.
    Par contre, j'ai essayé avec l'API QDom juste après du coup, et je dois dire que je n'ai pas réussi non plus.

    Votre solution n'est malheureusement pas bonne non plus, je vais vous joindre le fichier .ui complet de mon projet pour que vous vous fassiez une meilleur idée de ce que je souhaite vraiment, mais en gros les éléments que je veux détecter dans le fichier ne sont pas forcément toujours de même hiérarchie, avec votre code, je n'analyse que les éléments de 3ème rang maximum (par rang j'entends indentation).
    Ce qui est logique puisque vous allez jusqu'à e3, ma question est donc la suivante : est-il possible de parcourir mon fichier xml, mais de ne retirer les <strings> QUE des widget dans l'attribut "class" est de valeur "QLabel" tout en sachant que ces éléments peuvent être de hiérarchie différente?

    Cela voudrait dire que je devrais utiliser un code similaire au votre, mais qui va par exemple jusqu'à e10 si mon widget d'attribut "QLabel" le plus lointain est donc au rang 10?

    PS : j'ai été obligé de convertir le fichier en .txt car je ne peux apparement pas joindre de fichier .ui ici.
    Aussi, j'ai enlevé la partie connections à la fin de celui-ci puisqu'il n'y aura pas de "QLabel" dans celle-ci.

    Merci.

    PS2 : en compilant votre code avec le fichier que je vous joins on obtient comme résultat :

    class

    widget

    property

    resources
    Fichiers attachés Fichiers attachés

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Citation Envoyé par misr123 Voir le message
    Ce qui est logique puisque vous allez jusqu'à e3, ma question est donc la suivante : est-il possible de parcourir mon fichier xml, mais de ne retirer les <strings> QUE des widget dans l'attribut "class" est de valeur "QLabel" tout en sachant que ces éléments peuvent être de hiérarchie différente?

    Cela voudrait dire que je devrais utiliser un code similaire au votre, mais qui va par exemple jusqu'à e10 si mon widget d'attribut "QLabel" le plus lointain est donc au rang 10?
    Comme je l'ai dit le désavantage avec cette méthode est qu'il faut connaître la structure du document à l'avance. Mais il est tout-à-fait possible de parcourir toute la hiérarchie du fichier xml sans connaître la structure à l'avance. En utilisant la récursivité par exemple. Mon exemple était la simplement pour montrer comment fonctionne QDomDocument mais il peut être largement amélioré pour être plus générique.

    Je n'ai malheureusemnt pas le temps de proposer un petit exemple pour l'instant. j'essayerai de le faire cet après-midi.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci de votre réponse rapide, effectivement j'avais pensé à la récursivité mais je ne m'en sors vraiment pas, je vais faire autre chose en attendant.

    En relisant mon code j'avais à peu prés codé la même chose que vous, je suis débutant avec Qt et j'avoue que j'ai un petit peu de mal à imaginer une solution de récursivité dans ce cas.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut Récursivité
    Hello,

    Voici un exemple utilisant la récursivité:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include <QCoreApplication>
    #include <QDomDocument>
    #include <QFile>
    #include <QStringList>
    #include <QTextStream>
    #include <QDebug>
    #include <iostream>
     
    void browse(QDomNode n, QStringList &labelTexts)
    {
        while(!n.isNull()) {
     
            QDomElement e = n.toElement(); // try to convert the node to an element.
     
            if(e.attribute("class", "") == "QLabel"){
                qDebug() << "This is a QLabel";
     
                //Search "text" property inside QLabel
                QDomElement eTextProperty = e.firstChild().toElement();
                while(!eTextProperty.isNull()){
                    qDebug() << "   " << qPrintable(eTextProperty.tagName()) << endl; // the node really is an element.
                    qDebug() << "   " << eTextProperty.attribute("name", "");
                    if(eTextProperty.tagName() == "property" && eTextProperty.attribute("name", "") == "text"){
                        QString text = eTextProperty.firstChild().toElement().text();
                        labelTexts.append(text);
                        qDebug() << "Test of QLabel is : " << text;
                    }
                    eTextProperty = eTextProperty.nextSibling().toElement();
                }
     
            }
     
            if(n.hasChildNodes()){
                browse(n.firstChild(), labelTexts);
            }
     
            n = n.nextSibling();
        }
    }
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        bool ok = true;
        QDomDocument doc("mydocument");
        QFile file("xmlResponse.xml");
        if (!file.open(QIODevice::ReadOnly)){
            ok = false;
        } else {
            if (!doc.setContent(&file)) {
                file.close();
                ok = false;
            }
            file.close();
        }
     
        if(!ok) qDebug() << "\nerror\n";
     
        if(ok){
            // print out the element names of all elements that are direct children
            // of the outermost element.
            QDomElement docElem = doc.documentElement();
     
            QDomNode n = docElem.firstChild();
            QStringList labelTexts;
            browse(n, labelTexts);
     
            qDebug() << "Labels texts found: ";
            foreach(const QString &s , labelTexts){
                qDebug() << s;
            }
     
        }
     
        return a.exec();
    }
    J'obtiens le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    "Conditions d'examen"
    "Question posΘe"
    "Informations sur l'examen"
    "Contexte de l'examen"
    "Type d'EEG (*)"
    "Traitement en cours"
    "DonnΘes imageries (si pertinentes)"
    "Debut de la symptomatologie"
    "RΘanimation (*)"
    "TempΘrature Corporelle"
    "SΘdation"
    "Arret cardio-respiratoire"
    "DurΘe du low-flow"
    "DurΘe du no-flow"
    "Informations sur le patient"
    "Nom (*)"
    "PrΘnom (*)"
    "DDN (*)"
    "NIP (*)"
    "Pb sous X"
    "Consetement ΘclairΘ"
    "Nom (*)"
    "TΘlΘphone (*)"
    "Lieu d'exercice (*)"
    "PrΘnom (*)"
    "Fax"
    "Informations sur le mΘdecin prescripteur"
    "Email"
    "Nom (*)"
    "TΘlΘphone (*)"
    "Lieu d'exercice (*)"
    "PrΘnom (*)"
    "Fax"
    "Email"
    "Informations sur le technicien"
    "Nom de la machine d'acquisition"
    "Email"
    "Adresse 1"
    "TΘlΘphone"
    "Ville"
    "Service"
    "Adresse 2"
    "Nom"
    "Code Postal"
    "Informations sur l'hopital "
    "Les champs suivis d'une (*) sont obligatoires"
    Par contre il semble y avoir un petit problème au niveau de l'encodage des caractères. En effets les "é" ne sont pas reconnus correctement.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Merci de votre réponse, cela semble être exactement ce que je voulais.

    Je finis d'implémenter ça dans mon code et je vous tiens au courant.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Tout marche parfaitement, merci beaucoup.

  9. #9
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Content que cela fonctionne, de plus cela m'as permis de comprendre comment fonctionne l'API QDom

    Avez-vous résolu le problème concernant les caractères spéciaux (é, è, etc..) ?

    Edit: n'oubliez pas de mettre le sujet en résolu.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Aha si ça nous aide tous les deux c'est vraiment parfait.

    Ecoutez je n'ai pas ce soucis la chez moi bizarrement

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut QXmlStreamWriter/QStringList
    Je relance le fil de discussion ici car vous avez l'air de bien connaître Qt chezr Gojir4 aha.

    Cette fois-ci j'ai un soucis dans l'écriture de mon fichier XML. Mais je pense que le soucis vient de la façon dont je récupère mes QString dans mes QStringList.

    J'ai deux QStringList, l'une contenant les champs (ce que nous avons fait précédemment), et une autre contenant les valeurs de ces champs.

    Voici le code correspondant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    void mafenetre::generateXML(){
     
        QXmlStreamWriter writer;
        QFile file("donnees.xml");
     
        if (!file.open(QIODevice::WriteOnly))
           {
             QMessageBox::warning(0, "Error!", "Error opening file");
           }
        else
        {
            writer.setDevice(&file);
            writer.setAutoFormatting(true);
            writer.setAutoFormattingIndent(true);
            writer.writeStartDocument("4");
            QString str; str.setNum(maliste2.length());
            qDebug() << str;
     
     
     
            for ( int i = 0 ; i < maliste.length() ; i++){
                qDebug() << str.setNum(i);
              if(maliste.value(i) == ";"){
                   writer.writeStartElement(maliste2.value(i));
              }
              else{
                   writer.writeAttribute(maliste2.value(i),maliste.value(i));
              }
              writer.writeEndElement();
            }
            writer.writeEndElement();
            writer.writeEndDocument();
     
        }
     
    }
    Cela me genere une erreur Runtime, qui est la suivante : "ASSERT: "d->inStartElement" in file xml\qxmlstream.cpp, line 3413".

    Ce que je ne comprend pas, c'est que lorsque j'affiche directement mes QStringList après leurs créations, élément par élément dans des QMessageBox, en parcourant de la même façon mes deux listes, il n'y a aucun problème. Alors que la, j'ai ce soucis la.

    Le soucis est du à la QStringList "maliste" et pas non "maliste2", je le sais car quand j'enlève le "maliste" de la boucle for, je n'ai plus ce soucis (en écrivant bêtement que des start elements avec maliste2 par exemple). C'est à partir de i=1 que le soucis arrive..

    Merci d'avance

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    L'erreur provient de la fonction writeAttribute() (voir qmlstream.cpp, ligne 3391). En effet d'après la doc je dirais qu'il manque un paramètre à writeAttribute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer.writeAttribute(maliste2.value(i), "value", maliste.value(i));
    ou qu'il faut l'utiliser différement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer.writeAttribute("value", maliste.value(i));
    mais je n'ai pas testé.

    Une autre solution possible (inspiré d'ici):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writer.writeCharacters(maliste.value(i));
    p.s. Pour te simplifier la vie, tu pourrais utiliser une QListde QPair, au lieu de deux listes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QList<QPair<QString, QString > > maListe;

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    Bonjour et merci encore une fois de votre réponse.

    Le fait est que en gros, mes deux listes contiennent des QString, donc je ne vois pense pas que le soucis soit au niveau de paramètres de la fonction writeAttribute.
    En effet ma premiere liste contient comme je vous l'ai dit le nom du champ, et la deuxieme sa valeur.
    Le nom de l'attribut et donc l'élément i de maliste, et sa valeur correspondante l'élément i de maliste2.

    De plus, j'ai essayé d'utiliser vos prototypes et l'erreur est la même.

    Pour indication, lorsque je pose ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        writer.writeStartElement("Début");
            for ( int i = 0 ; i < maliste.length() ; i++ ){
                writer.writeAttribute(maliste2.value(i), maliste.value(i));
            }
            writer.writeEndElement();
            writer.writeEndDocument();
    Cela marche très bien.
    Dans mon précédent code, pour expliquer un peu plus en profondeur, ma premiere liste contient 45 champs, ma deuxieme 46.
    Le dernier champ de ma deuxieme liste ne m'interesse pas, c'est pour cela que je limite ma boucle fort à la taille de ma premiere liste.

    Dans ma premiere liste, j'ai rajouté volontairement des ";" aux indexs qui correspondent aux titres dans ma deuxieme liste, ainsi, si on a un ";" dans la premiere liste, cela correspond à un start element pour mon fichier xml, puis on ecrit les attributs de cet element jusqu'au prochain ";" etc..


    PS : Peut être que le soucis provient du fait que j'accède à la value 1 de maliste sans accèder aux valeurs d'avant? Je ne sais pas, je ne vois pas pourquoi est-ce que ca marche sans ma condition sur le ";".

    PS2 : A quoi correspond le d dans mon erreur "ASSERT: "d->inStartElement" in file xml\qxmlstream.cpp, line 3413" ? Dans le fichier qxmlstream si je lis le prototype de writeAttribute correspondant il n'a pas de paramètre ou de variable locale d.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    J'ai finalement résolu mon problème, avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            writer.writeStartDocument("4");        
            writer.writeStartElement(maliste2.value(0));
            for ( int i = 1 ; i < maliste.length() ; i++ ){
                qDebug() << str.setNum(i);
                if(maliste.value(i) == ";"){
                    writer.writeEndElement();
                    writer.writeStartElement(maliste2.value(i));
                }else{
                    writer.writeAttribute(maliste2.value(i), maliste.value(i));
                }
            }
            writer.writeEndDocument();
    Le soucis dans mon précédent code était que j'écrivais un EndElement à chaque itération de ma boucle fort, ce qui créait forcément un conflit...

  15. #15
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut Fichier xml cette fois
    Maintenant que j'ai mon fichier XML tout beau tout joli, bien indenté etc.. Je suis content!

    Par contre, je en comprend pas pourquoi lorsque j'essaye de l'afficher dans mon navigateur, j'ai ce message d'erreur : "Le signe d'égalité est absent entre l'attribut et la valeur de l'attribut."

    Je vous joins mon fichier xml (je n'ai jamais fait d'xml auparavant) pour que vous puissiez voir à quoi il ressemble, et éventuellement comprendre d'où provient le bug.

    Merci d'avance.

    (encore une fois j'envoie un fichier .txt car le forum n'accepte pas les fichier .xml en pièce jointe)
    Fichiers attachés Fichiers attachés

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bien joué, je n'avais pas remarqué l'erreur causé par le "writeEndElement". Je n'ai jamais utilisé l'API QXmlStream auparavant, et je dois dire que je préfère utiliser l'API QDom.

    Concernant le fichier Xml, je pense que l'erreur provient du fait que les noms des éléments sont composés de plusieurs mots, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Informations sur le patient>
    Du coup "sur", "le" et "patient" sont vu comme des attributs de "Informations" auxquelles il manquent les valeurs.

    Pour ne plus voir cette erreur, il faudrait supprimer les espaces dans le nom de l'élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <InformationsSurLePatient>

  17. #17
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    En effet après quelques recherches j'ai constaté que l'erreur venait de la, le soucis est que tout ça provient et est affiché dans une fenetre, or ce n'est pas très esthétique de coller tous ces caractères...

    Je vais essayer, une fois mon fichier xml généré, de coder une fonction qui enlève les espaces et autres caractères interdits ( ' , ( , ) ,... )

    Merci de votre aide en tout cas, au plaisir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [QtCore] Lecture d'un fichier xml avec QXmlStreamReader
    Par Jiyuu dans le forum PyQt
    Réponses: 0
    Dernier message: 11/04/2014, 13h48
  2. Questions sur QXmlStreamReader et sur les Regexp
    Par jderam dans le forum Débuter
    Réponses: 2
    Dernier message: 06/05/2009, 12h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo