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 :

QXmlStream

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Par défaut QXmlStream
    Bonjour,

    J'ai un petit problème avec mon programme qui permet d'enregistrer des informations (et de charger aussi mais pour l'instant on s'en occupe pas)

    Alors voilà ce qu'on obtient quand on enregistre les informations dans un Xml...

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <Informations>
        <Informations_Professeur>
            <Le_Professeur>
                <Nom_Professeur>Sandrine</Nom_Professeur>
            </Le_Professeur>
        </Informations_Professeur>
        <Nombre_Eleves>1</Nombre_Eleves>
        <Les_Eleves>
            <Eleve_1>
                <Eleve_Numero>Eleve_1</Eleve_Numero>
                <Nom_Eleve>Tom</Nom_Eleve>
            </Eleve_1>
        </Les_Eleves>
    </Informations>


    Jusqu'à là, ça fonctionne!

    J'ai une SpinBox et une ComboBox qui sont "synchronisées" ensemble et donc quand je choisis un nombre d'élèves égale à 3 par exemple, je souhaiterais obtenir dans le fichier Xml ceci:

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <Informations>
        <Informations_Professeur>
            <Le_Professeur>
                <Nom_Professeur>Sandrine</Nom_Professeur>
            </Le_Professeur>
        </Informations_Professeur>
        <Nombre_Eleves>3</Nombre_Eleves>
        <Les_Eleves>
            <Eleve_1>
                <Eleve_Numero>Eleve_1</Eleve_Numero>
                <Nom_Eleve>Tom</Nom_Eleve>
            </Eleve_1>
            <Eleve_2>
                <Eleve_Numero>Eleve_2</Eleve_Numero>
                <Nom_Eleve>Eva</Nom_Eleve>
            </Eleve_2>
            <Eleve_3>
                <Eleve_Numero>Eleve_3</Eleve_Numero>
                <Nom_Eleve>Phil</Nom_Eleve>
            </Eleve_3>
        </Les_Eleves>
    </Informations>


    J'arrive pas du tout à écrire le code qui me permettrait d'obtenir ce résultat.

    J'espère que quelqu'un pourra me débloquer...
    Pour gagner du temps je met mes fichiers sources en pièces jointes.

    Merci.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut


    Dis-moi, est-ce ta première utilisation du XML (en général) ? Ça semble, parce que tu passes ton temps à en violer les principes. Notamment, pourquoi avoir des balises qui changent pour exactement le même concept ? Le principe de XML est justement d'éviter ce genre de trucs, d'horreurs (si ça t'est obligé par l'énoncé de ton exercice, je te suggère de changer au plus vite ). Réécrit plus correctement, ton objectif est celui-ci :

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <informations>
        <professeurs>
            <professeur>
                <nom>Sandrine</nom>
            </professeur>
        </professeurs>
        <nombreEleves>3</nombreEleves>
        <eleves>
            <eleve>
                <numero>Eleve_1</numero>
                <nom>Tom</nom>
            </eleve>
            <eleve>
                <numero>Eleve_2</numero>
                <nom>Eva</nom>
            </eleve>
            <eleve>
                <numero>Eleve_3</numero>
                <nom>Phil</nom>
            </eleve>
        </eleves>
    </informations>

    Pour le reste, je n'ai aucune envie de lire ton code source, ni même de le télécharger : j'ai mieux à faire que d'ouvrir une archive, trouver le bon fichier, la bonne partie. Poste juste le bout de code qui correspond à ton problème, explique ce dernier correctement (qu'as-tu essayé ? qu'est-ce qui ne va pas ?), on pourra t'apporter une solution plus aisément .
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Par défaut
    J'avais jamais utilisé QXmlStreamWriter avant, j'ai choisi de créer des balises qui changent (<Eleve_1>, <Eleve_2>, etc) en fonction du choix fais dans une ComboBox.
    J'arrive à lire comme je le souhaite avec QXmlStreamReader mon fichier Xml mais pas pour l'écriture. C'est pour pouvoir allez lire les informations sur chaque élève que j'ai structuré mon Xml de cette façon.

    La partie du code pour l'enregistrement est:

    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
    void Xml_Para_Fenetre::enregistrer_()
    {
     
        QFile file(filename);
        file.open(QIODevice::WriteOnly);
     
        QXmlStreamWriter xmlWriter(&file);
        xmlWriter.setAutoFormatting(true);
        xmlWriter.writeStartDocument();
     
        xmlWriter.writeStartElement("Informations");
        xmlWriter.writeStartElement("Informations_Professeur");
        xmlWriter.writeStartElement("Le_Professeur");
        xmlWriter.writeTextElement("Nom_Professeur", nom_professeur->displayText ());
        xmlWriter.writeEndElement();
        xmlWriter.writeEndElement();
        xmlWriter.writeTextElement("Nombre_Eleves", QString::number(SpinBox1->value()));
     
        xmlWriter.writeStartElement("Les_Eleves");
        QString eleve = ComboBox1->currentText();
        xmlWriter.writeStartElement(eleve);
     
        xmlWriter.writeTextElement("Eleve_Numero", ComboBox1->currentText());
        xmlWriter.writeTextElement("Nom_Eleve", nom_eleve->displayText());
        xmlWriter.writeEndElement();
        xmlWriter.writeEndElement();
        xmlWriter.writeEndElement();
     
     
        xmlWriter.writeEndDocument();
        file.close();
    }
    Ce que je souhaite faire c'est de sélectionner dans la combobox "Eleve_1", remplir les champs d'informations, puis enregistrer dans le Xml.
    Ensuite de choisir dans la combobox "Eleve_2", remplir les champs d'informations et enregistrer à la suite dans le Xml.
    Etc.
    Le nombre d'item créé dans la combobox dépend du nombre qu'a choisi l'utilisateur en utilisant la spinbox.

    Alors qu’actuellement ça vient écraser les paramètres déjà enregistrer. (Ce qui est logique vu le code écrit ci-dessus)

  4. #4
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Dans ce cas, il suffit de transposer le XML (tu écris ton code comme tu écris ton XML, sans jamais revenir en arrière) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    QXmlStreamWriter xw(...);
     
    // ...
     
    xw.writeStartElement("eleves"); // <eleves>
     
    for(int i = 0; i < count; ++i) { // <eleve>
      xw.writeStartElement("eleve");
      // Le contenu de l'élève, à récupérer avec l'identifiant, par exemple. 
      xw.writeEndElement();
    } // </eleve>
     
    xw.writeEndElement(); // </eleves>
    En gros, en repartant de ton code, il suffit de voir ce à quoi correspond chaque ligne et d'insérer les bouts de XML qu'il faut (c'est pour ça que j'ai mis les balises correspondantes en commentaire, ça permet de s'y retrouver plus facilement en lisant rapidement le code).

    Si tu ne peux pas itérer simplement sur tes contrôles (ce qui ne me semble pas le cas, vu que l'utilisateur peut choisir le nombre d'enregistrements à inclure), déroule la boucle (copier-coller le code pour chaque itération – c'est laid mais ça fonctionne ).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 11
    Par défaut
    Merci pour l'aide, dans l'idée c'est tout à fait ça que je veux faire mais ça fonctionne pas.
    J'ai cette erreur:

    invalid operands of types 'int' and '<unresolved overload function type>' to binary 'operator<'

    Je suppose que ça vient du count mais je ne sais pas trop comment gérer cette erreur.

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