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

Windows Forms Discussion :

[xml] Ajout d'un noeud impossible


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de tenebriox
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 88
    Par défaut [xml] Ajout d'un noeud impossible
    Bonjour,

    Je souhaite enregistrer la conf de mon programme dans un fichier .xml

    Voici le code pour le créer :
    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
            Dim xmldoc As New XmlDocument
            xmldoc.Load("config.xml")
     
            Dim xmlemailing As XmlElement
            xmlemailing = xmldoc.CreateElement("Utilisateurs")
     
            Dim xmldossier As XmlElement
            xmldossier = xmldoc.CreateElement("dossier")
     
            Dim xmlnom As XmlElement
            xmlnom = xmldoc.CreateElement("nom")
     
            Dim xmlemail As XmlElement
            xmlemail = xmldoc.CreateElement("email")
     
            'traitement des noeuds
            xmldoc.DocumentElement.AppendChild(xmlemailing)
            xmlemailing.AppendChild(xmldossier)
            xmldossier.AppendChild(xmlnom)
            xmldossier.AppendChild(xmlemail)
     
            'Ajout
     
            xmldoc.DocumentElement.ChildNodes(1).ChildNodes(0).ChildNodes(0).InnerText = "nom"
            xmldoc.DocumentElement.ChildNodes(1).ChildNodes(0).ChildNodes(1).InnerText = "email"
    Ce qui fonctionne comme je le souhaite puisque j'obtiens un xml qui a cette allure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     <parametres>
    - <Conf>
      d'autres paramètres...
      </Conf>
    - <Utilisateurs>
    - <dossier>
      <nom>nom</nom> 
      <email>email</email> 
      </dossier>
      </Utilisateurs>
      </parametres>
    Maintenant, ce que j'aimerais, c'est ajouter un autre noeud dossier, pour obtenir :
    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
     
    - <Conf>
      d'autres paramètres...
      </Conf>
    - <Utilisateurs>
    - <dossier>
      <nom>nom</nom> 
      <email>email</email> 
      </dossier>
      <dossier>
      <nom>nom2</nom> 
      <email>email2</email> 
      </dossier>
      </Utilisateurs>
      </parametres>
    Lorsque j'essaye de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xmldoc.DocumentElement.ChildNodes(1).ChildNodes(1).ChildNodes(0).InnerText = "nom2"
            xmldoc.DocumentElement.ChildNodes(1).ChildNodes(1).ChildNodes(1).InnerText = "email2"
    La j'obtiens une erreur me disant que la référence n'existe pas =/
    Je ne comprends pas car le premier ajout marche

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par tenebriox Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xmldoc.DocumentElement.ChildNodes(1).ChildNodes(0).ChildNodes(0).InnerText = "nom"
            xmldoc.DocumentElement.ChildNodes(1).ChildNodes(0).ChildNodes(1).InnerText = "email"
    Ca fait mal à la tête quand je vois ça ... Comment tu arrives à t'y retrouver ?
    Ce serait pas plus simple avec Linq to XML ou la sérialisation XML ?

  3. #3
    Membre confirmé Avatar de tenebriox
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 88
    Par défaut
    Tout d'abord merci de m'avoir répondu (:
    J’ai complètement changé (et simplifié) mon code grâce à la sérialisation ! Mais la je suis un peu perdu dans le xml qui est crée (encore plus qu’avec mes childnoides précédents !!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Public Sub serialize(ByVal objet As ArrayList)
     
            Dim myFileStream As Stream = File.Create("testarray.xml")
            Dim serializer As New SoapFormatter
            serializer.Serialize(myFileStream, objet)
            myFileStream.Close()
     
        End Sub
    Donc, je serialize un tableau (arraylist), et j’obtiens ce xml :
    Et là, je ne comprends comment exploiter les informations qui m’intéressent
    Et j’ai également essayé de sérialiser une collection mais là (pour les 3 infos que je sérialise) j’obtiens un xml énorme et qui me parait encore plus inexploitable !


    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
     
    <SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    −
    <SOAP-ENV:Body>
    −
    <a1:ArrayList id="ref-1">
    <_items href="#ref-2"/>
    <_size>3</_size>
    <_version>3</_version>
    </a1:ArrayList>
    −
    <SOAP-ENC:Array id="ref-2" SOAP-ENC:arrayType="xsd:anyType[4]">
    <item id="ref-3" xsi:type="SOAP-ENC:string">C:\</item>
    <item id="ref-4" xsi:type="SOAP-ENC:string">1</item>
    <item id="ref-5" xsi:type="SOAP-ENC:string">Giga</item>
    </SOAP-ENC:Array>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Là tu n'as pas sérialisé en "simple" XML, mais en SOAP, qui est un format XML dédié aux webservices.

    Pour la sérialisation XML proprement dite, regarde ce tutoriel :
    http://tlevesque.developpez.com/dotn...serialization/

    (c'est du C#, mais le principe est le même...)

    Un petit exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Public Sub serialize(ByVal objet As ArrayList)
            Dim serializer As New XmlSerializer(GetType(ArrayList))
            Using writer As New StreamWriter("testarray.xml")
                serializer.Serialize(writer, objet)
            End Using
        End Sub
    Par contre, une ArrayList n'est pas idéale pour ce genre de chose, il vaudrait mieux utiliser une List(Of T), qui est fortement typée...

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Par défaut
    Sinon pour répondre à la question initiale, tu essayes d'éditer un childnode qui n'existe pas :
    En effet pour que la fonction ChildNodes(0).InnerText = "nom" fonctionne il faut auparavant avoir créé le noeud en utilisant la fonction CreateChildNode ou quelquechose du genre.

  6. #6
    Membre confirmé Avatar de tenebriox
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 88
    Par défaut
    Merci pour vous pencher sur mon problème et pour vos réponses constructives mais je n’y arrive toujours pas..
    Je veux sauvegarder les paramètres de mon programme :
    - Une partie où il y’a trois paramètres
    - Une autre partie où ce que je souhaite sauvegarder se trouve dans une datagridview à deux colonnes
    Voici un aperçu de mon datagridview



    La colonne dossier est généré par le programme (d’ailleurs, tant que j’y suis, est-il possible de rendre non modifiable uniquement cette colonne ?), et la colonne email à remplir par l’utilisateur.
    Moi je veux donc sauvegarder cet ensemble
    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
     
            Dim stream As New StreamWriter("configEnTest.xml", False)  'On crée/écrase le fichier
     
            Dim listconfig As List(Of String) = New List(Of String)
            Dim listdossiers As List(Of String) = New List(Of String)
            Dim listemails As List(Of String) = New List(Of String)
     
            Dim type As Type = GetType(List(Of String))
     
            Dim xmlserializer As XmlSerializer = New XmlSerializer(type)
     
            'ajout de la config à la list of string
            listconfig.Add(tbxdossier.Text)
            listconfig.Add(tbxtaille.Text)
            listconfig.Add(tbxudunite.Text)
     
            Dim nbelements As Integer = datagvmails.Rows.Count
     
            'ajout des dossiers et mails aux listes
            For i As Integer = 1 To nbelements - 1
                listdossiers.Add(datagvmails.Rows(i).Cells(0).Value)
                listemails.Add(datagvmails.Rows(i).Cells(1).Value)
            Next
     
     
     
            xmlserializer.Serialize(stream, listconfig) 'On serialize la config
            xmlserializer.Serialize(stream, listdossiers) 'On sérialize les dossiers
            xmlserializer.Serialize(stream, listemails) 'On sérialize les emails
    Mon problème est que le xml obtenu est illisible (Erreur d'analyse XML : données incompréhensibles après l'élément de document)

    Il ne l'est pas lorsque je sérialise un seul de ces trois éléments, donc l'erreur vient de là mais une fois de plus, je suis coincé

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

Discussions similaires

  1. [JDOM] ajout d'un noeud dans un fichier xml en java
    Par sampaiX dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 22/04/2010, 17h53
  2. [DOM] Ajout d'un noeud dans XML
    Par alliance dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 18/06/2009, 11h37
  3. XML:Simple, ajout d'un noeud
    Par LlufRuS dans le forum Modules
    Réponses: 1
    Dernier message: 10/02/2009, 18h47
  4. [DOM] Probleme d'ajout d'un noeud a un fichier XML
    Par Viscapon dans le forum Format d'échange (XML, JSON...)
    Réponses: 13
    Dernier message: 05/06/2008, 16h16
  5. Réponses: 4
    Dernier message: 07/04/2007, 23h18

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