Problème pour écrire un XmlNode

Résolu
gregory__forel Messages postés 36 Date d'inscription lundi 18 juillet 2005 Statut Membre Dernière intervention 18 juillet 2008 - 17 juil. 2008 à 22:16
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 - 18 juil. 2008 à 18:28
Bonjour à tous,

Je voudrais ajouter un nouveau noeud  pour que
<NoeudParent>
</NoeudParent>

devienne:
<NoeudParent>
      <NoeudEnfant>
      </NoeudEnfant>
</NoeudParent>

Avec mon code, ca me donne:
<NoeudParent>
      <NoeudEnfant />
</NoeudParent>

Le problème, c'est  qu'avec la solution obtenue par mon code, je n'arrive plus à ajouter de noeud au NoeudEnfant. Au lieu de l'ajouter comme ceci:
<NoeudParent>
      <NoeudEnfant>
          <NoeudEnfant2>
          </NoeudEnfant2>
      </NoeudEnfant>
</NoeudParent>

Il l'ajoute comme cela, comme si NoeudEnfant2 ne faisait pas partie de NoeudEnfant:
<NoeudParent>
      <NoeudEnfant />
      <NoeudEnfant2 />
</NoeudParent>

Voilà mon code:
Dim

xmlElement
As System.Xml.XmlElement = mStructuredDatasXmlDoc.CreateElement("NoeudEnfant")

mParentNode.AppendChild(xmlElement) '  mParentNode est le noeud parent (NoeudParent) sur je voudrais ajouter le noeud enfant
xmlDoc.Save(path
)
' Save xmlDocument

MERCI A TOUS POUR VOTRE AIDE !

5 réponses

gregory__forel Messages postés 36 Date d'inscription lundi 18 juillet 2005 Statut Membre Dernière intervention 18 juillet 2008
18 juil. 2008 à 17:17
Bon... j'ai une solution, pas très belle, mais j'ai pas le temps de faire mieux pour l'instant.


Je force à écrire le "end-tag" (</NoeudEnfant>) en ajoutant un InnerText vide, c'est tout.



xmlElement .InnerText =




""

En espérant que ca en aide certains. Encore merci pour ton aide Kevin.
3
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
17 juil. 2008 à 23:47
Salut,

Pour ajouter un noeud à l'enfant, il faut l'ajouter à la bonne place...

Dim xmlElement
As System.Xml.XmlElement = mStructuredDatasXmlDoc.CreateElement("NoeudEnfant")

mParentNode.AppendChild(xmlElement)

Dim xmlElement2
As System.Xml.XmlElement 

= mStructuredDatasXmlDoc.CreateElement("NoeudEnfant2")

xmlElement
.AppendChild(xmlElement2)

te donne :

<NoeudParent>
      <NoeudEnfant>
          <NoeudEnfant2 />
      </NoeudEnfant>
</NoeudParent>
0
gregory__forel Messages postés 36 Date d'inscription lundi 18 juillet 2005 Statut Membre Dernière intervention 18 juillet 2008
18 juil. 2008 à 14:45
Salut Kevin, et merci pour ta réponse. Ton exemple fonctionne parfaitement lorsque toutes les opérations sont effectuées à la suite, on crée NoeudEnfant
et NoeudEnfant 2
et on sauve le projet. Cela donne effectivement le bon résultat.

Le problème, c'est que je ne crée pas NoeudEnfant
et NoeudEnfant 2
au même moment. C'est l'utilisateur du programme qui les ajoute au fur et à mesure.

Donc si je fais:
Dim xmlElement
As System.Xml.XmlElement = mStructuredDatasXmlDoc.CreateElement("NoeudEnfant")

mParentNode.AppendChild(xmlElement)

je sauve le projet, ca me donne:
<NoeudParent>
      <NoeudEnfant />
</NoeudParent>

Si je veux maintenant ajouter un NoeudEnfant 2
à NoeudEnfant
, je n'arrive pas à obtenir le bon résultat, et le programme recommence à écrire les noeud l'un en dessous de l'autre.
<NoeudParent>
      <NoeudEnfant />
      <NoeudEnfant2 />
</NoeudParent>

Est-il possible de créer NoeudEnfant
directement comme ca ?
<NoeudParent>
      <NoeudEnfant>
      </NoeudEnfant>
</NoeudParent>

Merci pour ton aide !!
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
18 juil. 2008 à 18:20
Ouais et ça fonctionne? Ca m'étonne fortement, car au niveau XML, ceci :
<NoeudParent>
      <NoeudEnfant />
</NoeudParent>
et cela :
<NoeudParent>
      <NoeudEnfant>
      </NoeudEnfant>
</NoeudParent>
est exactement la même chose.
.NET choisit la 1ère solution pour alléger le poid du fichier XML (et la lisibilité), mais il gère les 2 solutions de la même manière (au niveau de la lecture / modification).
"Si je veux maintenant ajouter un NoeudEnfant 2
à NoeudEnfant
, je n'arrive pas à obtenir le bon résultat, et le programme recommence à écrire les noeud l'un en dessous de l'autre."
<NoeudParent>
      <NoeudEnfant />
      <NoeudEnfant2 />
</NoeudParent>
Ce que j'en dis, c'est que dans ce cas tu ajoute ton NoeudEnfant2 à NoeudParent et non à NoeudEnfant.
Il faut avant tout récupérer le noeud enfant, de cette façon. Voici un exemple de code:

Un formulaire avec 2 boutons. Form_Load va créer un document XML avec le noeud parent et un noeud enfant NoeudEnfant. Button1_Click va afficher le document XML dans la console, Button2_Click va ajouter un sous-enfant (NoeudEnfant2) à l'enfant NoeudEnfant

Private mStructuredDatasXmlDoc AsNew Xml.XmlDocument

PrivateSub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
' Créer le document XML
mStructuredDatasXmlDoc.LoadXml("<?xml version=""1.0"" encoding=""utf-8""?><NoeudParent></NoeudParent>")
' Récupérer le noeud parentDim mParentNode As Xml.XmlElement = mStructuredDatasXmlDoc.DocumentElement
' Ajouter un noeud enfantDim mChildNode As Xml.XmlElement = mStructuredDatasXmlDoc.CreateElement("NoeudEnfant")
mParentNode.AppendChild(mChildNode)
EndSub
PrivateSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
' Ajouter un sous-noeud au noeud enfant
' Récupérer le noeud enfantDim mChildNode As Xml.XmlElement = mStructuredDatasXmlDoc.DocumentElement.ChildNodes(0)
' Ajouter un sous-noeud à l'élément enfantDim mSubChildNode As Xml.XmlElement = mStructuredDatasXmlDoc.CreateElement("NoeudEnfant2")
mChildNode.AppendChild(mSubChildNode)
EndSub
PrivateSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Afficher le document XML dans la console
mStructuredDatasXmlDoc.Save(Console.Out)
EndSub

Après quelques cliques sur Button2, ça donne ceci:

</NoeudParent><?xml version="1.0" encoding="Windows-1252"?>
<NoeudParent>
  <NoeudEnfant>
    <NoeudEnfant2 />
    <NoeudEnfant2 />
    <NoeudEnfant2 />
    <NoeudEnfant2 />
  </NoeudEnfant>
</NoeudParent>

(demande moi pas d'ou vient ce encoding="Windows-1252")
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
18 juil. 2008 à 18:28
Mouais, pas fameux la mise en page du code, le revoici:

Private mStructuredDatasXmlDoc As New Xml.XmlDocument
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' Créer le document XML
    mStructuredDatasXmlDoc.LoadXml("<?xml version=""1.0"" encoding=""utf-8""?><NoeudParent></NoeudParent>")
    ' Récupérer le noeud parent
    Dim mParentNode As Xml.XmlElement = mStructuredDatasXmlDoc.DocumentElement
    ' Ajouter un noeud enfant
    Dim mChildNode As Xml.XmlElement = mStructuredDatasXmlDoc.CreateElement("NoeudEnfant")
    mParentNode.AppendChild(mChildNode)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

   ' Ajouter un sous-noeud au noeud enfant
    ' Récupérer le noeud enfant
   
Dim mChildNode As Xml.XmlElement = mStructuredDatasXmlDoc.DocumentElement.ChildNodes(0)
   
' Ajouter un sous-noeud à l'élément enfant

    Dim mSubChildNode As Xml.XmlElement = mStructuredDatasXmlDoc.CreateElement("NoeudEnfant2")
    mChildNode.AppendChild(mSubChildNode)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   

    ' Afficher le document XML dans la console

    mStructuredDatasXmlDoc.Save(Console.Out)

End Sub
0
Rejoignez-nous