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

Qt Discussion :

[XML] Modifier les valeurs dans un fichier


Sujet :

Qt

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 47
    Par défaut [XML] Modifier les valeurs dans un fichier
    Bonjour,
    J'ai actuellement ce programme sur Qt permettant d'archiver des valeurs sous format XML mais le problème c'est que j'écrase les valeurs précédentes à chaque enregistrement.
    J'aimerais donc faire en sorte d'archiver les valeurs tout en gardant les précédentes (dans le même document si possible).

    Que dois-je modifier ou rajouter dans le code
    Merci

    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
     
    void IHMPrincipal::on_ButtonXML_clicked()
    {
        qDebug() << "on_ButtonXML_clicked()";
                QFile output("ValeursPhysique.xml");
                if(output.open(QFile::WriteOnly))
                    { //Si le fichier s'ouvre correctement
                    qDebug() << "Ouverture fichier OK"; //Ce message est envoyé dans la sortie de l'application
                    QXmlStreamWriter stream(&output); //La classe QXmlStreamWriter fournit un éditeur XML pour l'écriture
                    stream.setAutoFormatting(true);
                    stream.writeStartDocument(); //Début du document
     
                    //ValeursPhysique
                    stream.writeStartElement("ValeursPhysique"); //Ouverture de la balise "ValeursPhysique"
                   //Valeur
                           stream.writeStartElement("Valeurs"); //Ouverture de la 2eme balise "Valeurs"
                           stream.writeTextElement("RF", QString::number(std::fmod(ui->lineEditRF->text().toDouble(), 256))); /*writeTextElement() est une méthode utilisée
                            pour écrire des éléments qui ne contiennent que du texte. Ici on récupère la valeur de RF pour l'afficher dans le XML*/
                            //std::fmod -> Calcule le reste à virgule flottante
                           stream.writeTextElement("MPX", QString::number(std::fmod(ui->lineEditMPX->text().toDouble(), 256))); //idem pour MPX
                           stream.writeTextElement("Pilot", QString::number(std::fmod(ui->lineEditPilot->text().toDouble(), 256))); //idem pour Pilot
                           stream.writeTextElement("RDS", QString::number(std::fmod(ui->lineEditRDS->text().toDouble(), 256))); //idem pour RDS
                           stream.writeTextElement("AG", QString::number(std::fmod(ui->lineEditAG->text().toDouble(), 256))); //idem pour AG
                           stream.writeTextElement("AD", QString::number(std::fmod(ui->lineEditAD->text().toDouble(), 256))); //idem pour AD
                           stream.writeTextElement("Tension", QString::number(std::fmod(ui->lineEditTension->text().toDouble(), 256))); //idem pour la Tension
                           stream.writeTextElement("Freq", QString::number(std::fmod(ui->lineEditFreq->text().toDouble(), 65536)));//idem pour la Frequence
                           stream.writeEndElement(); // Fin de la balise "Valeurs"
                           stream.writeEndElement(); // Fin de la balise "ValeursPhysique"
                           stream.writeEndDocument(); //Fin du document
                       }
                else qDebug() << "Erreur ouverture fichier: " << output.errorString(); //Si erreur sur l'ouverture, ce message apparaît
                output.close();
    }

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La seule solution, c'est de travailler sur deux valeurs différentes : l'ancienne valeur et la valeur courante.

    De cette manière, tu sauvegarde les deux valeurs, et tu créeras donc deux noeuds distincts dans ton fichier

    Si tu n'utilisais pas XML (mais pas json non plus pour le coup), tu aurais pu envisager d'ouvrir ton fichier d'origine en mode "append (std::ios::app)", et de rajouter les éléments qui ont été modifiés à la suite du reste.

    Mais, comme tu utilise un format récursif qui ne peut avoir qu'une seule racine, sous la forme de
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <root>
        <child1>
           <subChild1>    </subChild1>
           <subChild2>    </subChild2>
           <!-- .... -->
            <subChildN>    </subChildN>    
       </child1>
        <!-- ... -->
    </root>
    c'est rapé : il faut réécrire tout le fichier lorsque tu veux sauvegarder une modification.

    Et n'oublie pas de faire gaffe au cas "peau de banane" : quand tu as déjà une ou plusieurs modifications qui ont été sauvegardées, tu ne veut peut-être pas non plus le perdre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 47
    Par défaut
    C'est à dire que le programme que j'ai fais, je dois le refaire autrement ?
    Je pensais qu'il fallait rajouter quelques lignes...

    Parce que j'avoue, j'ai pas vraiment compris comment procéder.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Tu dois, de toutes manières, essayer de créer ton "arbre" XML de manière correcte:

    Si ton but est de modifier un noeud XML dans ton fichier, tu peux en modifier directement le contenu dans ton application et enregistrer les modifications.

    Mais si ton but est d'ajouter un noeud XML dans ton fichier, tu n'as pas beaucoup le choix: tu dois... ajouter ce noeud dans ton arbre XML, de manière à ce qu'il puisse être enregistré en même temps que tout le reste
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/12/2005, 14h17
  2. Utiliser un fichier XML sur un serveur FTP
    Par ired dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/04/2005, 13h43
  3. middleware XML sur pocket PC
    Par pimousse_on_ice dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 30/11/2004, 21h16
  4. Manipulation de XML sur base de données
    Par psyche dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 02/11/2004, 14h07
  5. XML sur le portal
    Par nic211 dans le forum Oracle
    Réponses: 13
    Dernier message: 20/08/2004, 11h04

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