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

  1. #1
    Membre régulier 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
    Points : 119
    Points
    119
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    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 régulier 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
    Points : 119
    Points
    119
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    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 éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    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 régulier 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
    Points : 119
    Points
    119
    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é

  7. #7
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par tenebriox Voir le message
    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é
    Ben c'est normal, tu écris 3 documents XML complets dans le même fichier... un document XML ne peut avoir qu'un seul élément racine.

    A mon avis, ton problème est surtout lié à la structure de tes données... par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Dim listdossiers As List(Of String) = New List(Of String)
            Dim listemails As List(Of String) = New List(Of String)
    Si je comprends bien d'après ton screenshot, chaque dossier a un email correspondant ? Dans ce cas, les stocker dans des listes séparées est une mauvaise idée... tu risques de te retrouver avec des incohérences entre les 2 listes, ce qui va tout décaler

    Il faut que tu crées une ou des classe(s) pour représenter tes données de configuration. Ensuite, il suffira de sérialiser/désérialiser cette classe

    Par exemple, tu pourrais faire quelque chose comme ça (je n'écris pas tout le code des propriétés, pour faire plus court) :

    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
    ' Représente une paire dossier/email
    Public Class ConfigDossier
        Public Property Dossier As String ...
        Public Property Email As String ...
    End Class
     
    ' Classe principale des données de configuration
    Public Class Config
        ' Les propriétés qui correspondent aux 3 textbox que tu enregistres dans listconfig :
        Public Property Dossier As String ...
        Public Property Taille As Integer ...
        Public Property Unite As String ...
     
        Public Property Dossiers As List(Of ConfigDossier) ...
    End Class
    Ensuite, tu crées un objet Config et tu le sérialises :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim cfg As New Config()
    cfg.Dossier = tbxdossier.Text
    cfg.Taille = Int32.Parse(tbxdossier.Text)
    cfg.Unite = tbxdossier.Text
    ' Pour chaque ligne du DGV
    Dim d As New ConfigDossier
    d.Chemin = ...
    d.Email = ...
    cfg.Dossiers.Add (d)
     
    Dim xs As New XmlSerializer(GetType(Config))
    Using stream As New StreamWriter("configEnTest.xml")
        xs.Serialize(stream, cfg)
    End Using
    D'ailleurs, plutôt que de remplir/relire le DGV à la main, je te conseille de définir la liste Dossiers comme DataSource, comme ça c'est automatique

  8. #8
    Membre régulier 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
    Points : 119
    Points
    119
    Par défaut
    Merci pour ta patience, j'y suis maintenant arrivé

+ 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