Partage
  • Partager sur Facebook
  • Partager sur Twitter

XML

je patoge ...

    14 août 2011 à 2:13:27

    Bonjour à tous !

    Je suis un peu perdu ...

    En fait j'ai suivi le lien donner par Kvel dans ce topic :
    Manipulation fichiers XML
    J'ai pu comprendre le concept de balises, de parent/enfant, j'ai même fait un petit dessin pour bien definir mes données à sauvegarder et comment je voulais les organiser dans le fichier. :lol:

    J'en suis arrivé à ça :
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
            'on déclare le fichier XML qui va sauvegarder les informations
            '-----------------------------------------
            '             position à revoir
            '-----------------------------------------
            'création de l'instance qui permettra la création du document
            Dim Xmldossier As XmlDocument = New XmlDocument()
            'on crée le document
            Xmldossier.LoadXml("[riverain][/riverain]")
    
    
            '------------------------------------------------------------------------
            'ICI assignation des zones de sauvegarde pour la partie PROPRIO
            '------------------------------------------------------------------------
            'déclaration et création de la balise proprio (enfant de xmldossier)
            Dim elem_proprio As XmlElement
            elem_proprio = Xmldossier.CreateElement("proprio")
            Dim elem_proprio_nom As XmlElement
            elem_proprio_nom.InnerText = visible_proprio_nom.Text
            Dim elem_proprio_intitule As XmlElement
            elem_proprio_intitule.InnerText = visible_proprio_intitule.Text
            Dim elem_proprio_adresse As XmlElement
            elem_proprio_adresse.InnerText = visible_proprio_adresse.Text
            Dim elem_proprio_code_postal As XmlElement
            elem_proprio_code_postal.InnerText = visible_proprio_code_postal.Text
            Dim elem_proprio_ville As XmlElement
            elem_proprio_ville.InnerText = visible_proprio_ville.Text
            Dim elem_proprio_phone_01 As XmlElement
            elem_proprio_phone_01.InnerText = visible_proprio_phone_01.Text
            Dim elem_proprio_phone_02 As XmlElement
            elem_proprio_phone_02.InnerText = visible_proprio_phone_02.Text
            Dim elem_proprio_mail_01 As XmlElement
            elem_proprio_mail_01.InnerText = visible_proprio_mail_01.Text
            Dim elem_proprio_mail_02 As XmlElement
            elem_proprio_mail_02.InnerText = visible_proprio_mail_02.Text
            Dim elem_proprio_remarque As XmlElement
            elem_proprio_remarque.InnerText = visible_proprio_remarque.Text
            'on ajoute la balise proprio au document
            Xmldossier.AppendChild(elem_proprio)
            '------------------------------------------------------------------------
            'ICI assignation des zones de sauvegarde pour la partie LOCA (à faire)
            '------------------------------------------------------------------------
            'déclaration et création de la balise loca (enfant de xmldossier)
            Dim elem_loca As XmlElement
            elem_loca = Xmldossier.CreateElement("loca")
            'on ajoute la balise loca au document
            Xmldossier.AppendChild(elem_loca)
    
    
            '------------------------------------------------------------------------
            'ICI assignation des zones de sauvegarde pour la partie ADP (à faire)
            '------------------------------------------------------------------------
            'déclaration et création de la balise adp (enfant de dossier)
            Dim elem_adp As XmlElement
            elem_adp = Xmldossier.CreateElement("adp")
            'on ajoute la balise adp au document
            Xmldossier.AppendChild(elem_adp)
    
            '------------------------------------------------------------------------
            'ICI assignation des zones de sauvegarde pour la partie HABITATION (à faire)
            '------------------------------------------------------------------------
            'déclaration et création de la balise proprio (enfant de dossier)
            Dim elem_habitation As XmlElement
            elem_habitation = Xmldossier.CreateElement("habitation")
    
            '------------------------------------------------------------------------
            'Fin de l'assignation
            '------------------------------------------------------------------------
            'on ajoute la balise habitation au document
            Xmldossier.AppendChild(elem_habitation)
    
            'ecriture du XML
            Xmldossier.Save(Application.StartupPath & "origine.XML")
    


    Quand je lance le programme, et que je clique sur le bouton sauvegarder, il me dit que :
    "Données non valides au niveau racine. Ligne 1, position 1." (pour la ligne 9 du code en fait)

    J'ai un peu de mal ... si vous pouviez m'aider ...

    Le deuxieme souci est que je ne sais pas comment récupérer l'event de clic du bouton sauvegarder dans ma "dialogsavefile".
    Dans l'exemple au dessus, j'ai utilisé un bouton que j'ai mis vite fait sur mon formulaire pour tester le code

    Il faut savoir qu'il y a 48h je ne savais pas ce qu'était le XML. :p

    Soyez indulgent si j'ai écrit n'importe quoi en haut ... :-° (il est cool ce smiley!)

    Merci pour les futurs réponses!

    ^^
    • Partager sur Facebook
    • Partager sur Twitter
      14 août 2011 à 8:51:50

      Salut,

      Perso, j'ai fait autrement. J'ai d'abord créé mon document XML vide

      Private Sub CreerCarnetXMLVide()
              Dim fichier As String = "D:\carnet.xml"
              If My.Computer.FileSystem.FileExists(CarnetFile) = False Then
                  Dim XMLDocu As XmlDocument = New XmlDocument
                  Dim XMLDecl As XmlDeclaration
                  Dim XMLElem As XmlElement
                  XMLElem = XMLDocu.CreateElement("Root")
                  XMLDocu.AppendChild(XMLElem)
                  XMLDecl = XMLDocu.CreateXmlDeclaration("1.0", Nothing, Nothing)
                  XMLDocu.InsertBefore(XMLDecl, XMLDocu.DocumentElement)
                  XMLDocu.Save(fichier)
                  ChargementXML(fichier)
              End If
          End Sub
      


      Ensuite j'y ajoute l'enregistrement :

      Private Sub AjoutSeance()
              Dim Carnet As XmlDocument = New XmlDocument
              Dim nSeance As XmlElement = Carnet.CreateElement("Seance")
              Dim nDate As XmlElement = Carnet.CreateElement("Date")
              Dim nDuree As XmlElement = Carnet.CreateElement("Duree")
              nDate.InnerText = TextBoxDate.text
              nDuree.InnerText = TextBoxDuree.Text
              nSeance.AppendChild(NDate)
              nSeance.AppendChild(NDuree)
              Carnet.Load(Fichier)
              Carnet.DocumentElement.AppendChild(nSeance)
              Carnet.Save(Fichier)
      End Sub
      


      Mon fichier ressemble à cela après 1 création et 2 ajouts :

      <?xml version="1.0"?>
      <Root>
        <Seance>
          <Date>25/05/2011</Date>
          <Duree>00:35:00</Duree>
        </Seance>
        <Seance>
          <Date>27/05/2011</Date>
          <Duree>01:00:43</Duree>
          <Distance>8,5</Distance>
        </Seance>
      


      Bien entendu j'ai beaucoup plus entrées mais j'ai simplifié pour éviter le code à rallonge.

      @+
      • Partager sur Facebook
      • Partager sur Twitter
        14 août 2011 à 11:22:33

        Merci Kvel, je vais essayer cette démarche.

        A+
        • Partager sur Facebook
        • Partager sur Twitter
          14 août 2011 à 14:34:41

          @Mang: Ton erreur vient d'ici:

          Xmldossier.LoadXml("[riverain][/riverain]")
          

          "[riverain][/riverain]" n'est pas du XML.

          Ensuite, au moment de créer tes éléments:
          Dim elem_proprio_nom As XmlElement
          elem_proprio_nom.InnerText = visible_proprio_nom.Text
          

          n'oublie pas d'instancier tes éléments avant de les manipuler !

          Au passage Liek a cité XDocument dans l'autre topic, qui est plus facile d'emploi que XmlDocument (surtout en VB.NET). Exemple avec le code de Kvel:

          Private Sub AjoutSeance()
              Dim newElement As XElement = _
                  <Seance>
                      <Date><%= TextBoxDate.text %></Date>
                      <Duree><%= TextBoxDuree.Text %></Duree>
                  </Seance>
          
              Dim fichier As String = "D:\carnet.xml"
              Dim doc As XDocument = XDocument.Load(fichier)
              doc.Root.Add(newElement)
              doc.Save(fichier)
          End Sub
          

          • Partager sur Facebook
          • Partager sur Twitter
            14 août 2011 à 17:39:46

            En effet, c'est nettement plus simple et on gagne même en clarté je trouve. Je tâcherais de m'en servir si j'ai à en réutiliser. Dommage, je viens de finir mon programme basée sur de la sauvegarde XML.

            @+
            • Partager sur Facebook
            • Partager sur Twitter
              14 août 2011 à 18:43:17

              Yo!
              Effectivement Orwel, c'était bien là mon erreur. Mais étant nouveau dans le programmation, je patoge un peu (beaucoup? :lol: ). Je viens de me farcir tout plein de lecture sur le xml ... trop bien! :-°
              Bref... je comprends mieux maintenant. Surtout le nouveau code que tu viens de me présenter :
              Private Sub AjoutSeance()
                  Dim newElement As XElement = _
                      <Seance>
                          <Date><%= TextBoxDate.text %></Date>
                          <Duree><%= TextBoxDuree.Text %></Duree>
                      </Seance>
              
                  Dim fichier As String = "D:\carnet.xml"
                  Dim doc As XDocument = XDocument.Load(fichier)
                  doc.Root.Add(newElement)
                  doc.Save(fichier)
              End Sub
              


              Comme dit Kvel, c'est plus "simple" mais c'est surtout plus clair (en tout cas cas pour mes yeux de novice).

              Je viens de me faire un fichier text où j'ai écrit toutes mes données à sauvegarder. J'ai fait ça de la manière "xml", avec les balises correspondante je veux dire.

              Je reviens quand j'ai testé ça.

              Merci à vous en tout cas!
              (ça chome pas le dimanche!)

              ;)
              • Partager sur Facebook
              • Partager sur Twitter
                16 août 2011 à 18:48:36

                Rebonjour la compagnie!

                Bon, j'ai avancé. J'arrive à sauvegarder un fichier XML.
                Par contre, le souci qui se pose, c'est que je n'arrive pas à récupérer l'adresse donner dans la savefiledialog ni le nom du fichier donné dans la textbox de celle-ci.
                Je sauvegarde dans un endroit fixe, du style "D:\test.xml", avec un nom fixe. Mais bon, je pense que je vais trouver.

                La seconde chose qui m’embête c'est plutôt le fait que si je sauvegarde une 2nd fois, il va écrire à la suite et non remplacer les donner dans le fichier xml ...

                Mais bon j'ai de quoi relire dans le tutoriel du site, et je vois un peu mieux mes lacunes, c'est pas mal.
                Si vous pouvez me guider pour mon second problème (écriture à la suite et non remplacement des données) ce serait sympa!

                Je vous remercie pour votre aide!

                *repars relire encore et encore ...*
                ^^
                • Partager sur Facebook
                • Partager sur Twitter
                  16 août 2011 à 22:38:21

                  Bonjour,

                  J'ai moi-même regardé comment utiliser Xml au mieux pour sauvgarder des données. Je pense que de créer une classes du style "data" et d'utiliser XmlSerializer Class et tu peux très facilement modifier la manière dont c'est sauvegardé avec les attributes
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 août 2011 à 10:11:45

                    Merci oziegamma.

                    Je suis justement en train de potasser ça.
                    Le souci c'est que je ne maîtrise pas encore réellement le concept de "classe" et plus loin la POO.
                    J'y travaille, et je reviendrai sur mon problème de sauvegarde plus tard.

                    Petite question, tu n'as pas de souci de sauvegarde? Du genre ça sauvegarde à la suite dans le fichier au lieu d'écraser les anciennes données?

                    Merci à toi!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 août 2011 à 10:20:27

                      ça dépends de comment tu ouvres ton StreamWriter. Il y a un constructeur qui prends 2 arguments: d'abord le string qui dit quel fichier ouvrir et puis un boolean qui dit si on doit ajouter ou pas. Je pense qu'il suffit de le mettre sur false.
                      Je testerai bien ça moi-même mais je ne suis pas chez moi et je ne connais pas la syntaxe VB.NET(je connais le c# par compte)

                      Regarde ça : StreamWriter Constructor(String, Boolean)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 août 2011 à 12:21:37

                        @oziegamma: tu pourras remarquer qu'on n'a pas parlé de StreamWriter dans ce topic parce qu'il n'y en a pas dans son code.

                        @Mang: Le comportement que tu observes correspond bien au code qui a été donné plus haut:
                        Private Sub AjoutSeance()
                            Dim newElement As XElement = _
                                <Seance>
                                    <Date><%= TextBoxDate.text %></Date>
                                    <Duree><%= TextBoxDuree.Text %></Duree>
                                </Seance>
                        
                            Dim fichier As String = "D:\carnet.xml"
                            Dim doc As XDocument = XDocument.Load(fichier)
                            doc.Root.Add(newElement)
                            doc.Save(fichier)
                        End Sub
                        


                        En regardant les 3 dernières lignes tu peux voir qu'on charge le document et qu'on y insère un nouvel élément avant de l'enregistrer. Il y a donc bien toujours ajout de données en fin de fichier.

                        Si ce n'est pas le comportement que tu veux avoir, il faut modifier plusieurs choses: en gros tu vas devoir charger tes données en mémoire au démarrage de ton programme, manipuler ces données en mémoire selon les actions de l'utilisateur, puis enregistrer le tout en XML à la fin du programme. Le XmlSerializer est effectivement efficace pour ce genre de choses; cependant il faut faire un choix entre XDocument et XmlSerializer pour éviter de mélanger les techniques.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 août 2011 à 12:49:00

                          @Orwell: je parlais du StreamWritter dans l'optique de l'utilisation du XmlSerializer qui a mon avis est plus adapté pour ce qu'il veut faire(mapper des données avec un fichier XML).

                          Et effectivement je suis d'accord avec toi qu'il ne faut pas mélanger les deux.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 août 2011 à 16:13:00

                            Ok, j'ai bien compris!

                            La première solution du topic correspondait effectivement à la question du moment. Bien entendu, je voulais plus. ^^

                            J'ai compris le principe du xmlserializer class, et je pense me tourner vers ça. Mais avant, je dois assimiler le principe de l'objet/class ... :-°

                            Merci en tout cas pour vos remarques, ça me fait avancer.

                            Qu'en j'en aurai fini avec ça, je posterai la solution.

                            ;)
                            • Partager sur Facebook
                            • Partager sur Twitter

                            XML

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown