Problème modification noeud fichier xml [Résolu]

bastien27100 31 Messages postés mardi 18 mai 2010Date d'inscription 8 juin 2011 Dernière intervention - 22 juin 2010 à 15:39 - Dernière réponse : bastien27100 31 Messages postés mardi 18 mai 2010Date d'inscription 8 juin 2011 Dernière intervention
- 24 juin 2010 à 12:11
Bonjour a tous,
je vous explique mon problème, j'ai un fichier xml nommée "settings.xml", dans mon form2 j'ai un bouton enregistrer qui me permet de sauvegarder le contenu des textbox, listbox, radiobutton entré par l'utilisateur, ce contenu se retrouve donc dans le fichier settings.xml, dont voici un extrait :

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- settings.xml v1.0.0.2
Ce fichier ne devrait pas etre modifie a la main.
Il contient tout les parametres configurables de web.-->
<Ceri>
1
<Titre>info</Titre>
<Categories>Bureautique</Categories>
<Logiciel>Word</Logiciel>
<Desc>logiciel</Desc>
<Solution>windows</Solution>
2
<Titre>visual</Titre>
<Categories>CN</Categories>
<Marque.CN>Num</Marque.CN>
<Desc>tel</Desc>
<Solution>marque</Solution>
</Ceri>

donc les balises Article, Titre, Catégories... sont les noms des labels correspondant aux differentes textbox, listbox...,
jusqu'ici tout fonctionne correctement, j'enregistre tout sa dans mon fichier xml de cette façon :

'Se trouve dans la classe xml
Public Sub addElement(ByVal path As String, ByVal nom As String, ByVal valeur As String)

Try
Dim doc As New XmlDocument
doc.Load(fichier)
Dim root As XmlNode = doc.SelectSingleNode(path)
Dim elem As XmlElement = doc.CreateElement(nom)
elem.InnerText = valeur
root.AppendChild(elem)
doc.Save(fichier)
Catch e As Exception
MsgBox("Erreur : " & e.Message)
End Try

End Sub

'Se trouve dans Form2
Private Sub BT_ENREG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_ENREG.Click

Dim X As New xml("settings.xml")

X.addElement("/Ceri", Label1.Text, Form1.Label12.Text + 1)
X.addElement("/Ceri", Label2.Text, TXT_BOX4.Text)
If BTR_1.Checked Then
X.addElement("/Ceri", Label3.Text, BTR_1.Text)
End If
If BTR_2.Checked Then
X.addElement("/Ceri", Label3.Text, BTR_2.Text)
End If
If BTR_3.Checked Then
X.addElement("/Ceri", Label3.Text, BTR_3.Text)
End If
If BTR_4.Checked Then
X.addElement("/Ceri", Label3.Text, BTR_4.Text)
End If
If BTR_5.Checked Then
X.addElement("/Ceri", Label3.Text, BTR_5.Text)
End If
X.addElement("/Ceri", Label4.Text, LT_BOX2.Text)
X.addElement("/Ceri", Label5.Text, TXT_BOX5.Text)
X.addElement("/Ceri", Label6.Text, TXT_BOX6.Text)

X = Nothing

End Sub

Il y a deux choses que je voudrais ajouter :
- à coté de mon bouton enregistré se trouve un bouton modifier, je voudrais donc pouvoir modifier certains noeuds à l'intérieur de mon fichier, j'y était parvenu dans des fichiers txt, mais maintenant je voudrais faire la même chose avec un fichier xml, j'ai trouvé ceci sur la msdn :

Private Sub BT_MODIF_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_MODIF.Click
' Create the XmlDocument.
Dim doc As XmlDocument = New XmlDocument()
doc.Load("essai.xml")

Dim book As XmlNode
Dim nodeList As XmlNodeList
Dim root As XmlNode = doc.DocumentElement

nodeList = root.SelectNodes("descendant::book[author/last-name='Austen']")

' Change le prix du livre
For Each book In nodeList
book.LastChild.InnerText = "15.95"
Next

doc.Save(Console.Out)
MsgBox("Modification éffectuée")
end sub

je ne l'ai pas encore adaptée a mon fichier, tout simplement parce qu'il ne fonctionne déjà pas avec le leur, quand je clique sur le bouton modifier, l'heure de modification du fichier essai.xml ne change même pas.

j'ai aussi essayer ceci :
Try
Dim XMLconfig As XmlDocument = New XmlDocument

XMLconfig.Load("settings.xml")
Dim node As XmlNode = XMLconfig.DocumentElement
For Each node In node.ChildNodes
If node.Name = "Titre" Then
node.InnerText = TXT_BOX4.Text
End If
Next
XMLconfig.Save("settings.xml")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

mais il me modifier toutes mes balises Titre au lieu d'une seule, il faudrait peut être ajouter un index mais comment...

- La seconde chose que je voudrais faire, est de charger tout mes noeuds article dans une listbox, tout mes noeuds Titres dans une autre etc... j'y était parvenu avec un fichier texte, mais la je ne vois pas trop comment faire pour ne charger que ce qui se trouve entre les balises articles, titres... j'ai juste essayer ceci :
Form1.LT_BOX1.Items.AddRange(System.IO.File.ReadAllLines("settings.xml"))
mais bien évidemment il me charge le fichier complet, je pense qu'il faudrat utiliser SelectNodes("") mais je ne voit pas comment faire.

ps : désolé d'avoir retiré tout les commentaires de mon code, mais le message aurait était encore beaucoup plus long!

J'espère avoir était assez explicite, merci d'avance à ceux qui prendront le temps de me venir en aide, j'attends vos réponses avec impatience
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
cs_christoni 140 Messages postés mardi 25 novembre 2003Date d'inscription 1 novembre 2010 Dernière intervention - 23 juin 2010 à 15:04
3
Merci
Bonjour,
à tester pour la seconde question :
plutôt utiliser un XmlNodeList pour lister tous les noeuds ayant le même nom :
    Private Sub listBalisesIdentiques(ByVal monFichier As String, ByVal pattern As String, ByVal recepteur As ListBox)
        '*** monFichier = le fichier XML à sonder.
        '*** pattern = l'expression XPath pour rechercher les noeuds correspondants.
        '*** recepteur = le contrôle afficheur.

        '*** Représente un document XML en mémoire et charge les données XML spécifiées
        Dim doc As XmlDocument = New XmlDocument()
        doc.Load(monFichier)

        '*** Sélectionne une liste de nœuds correspondant à l'expression XPath recherchée,
        '    et les stocke dans une collection 
        Dim nodeList As XmlNodeList
        Dim root As XmlElement = doc.DocumentElement
        nodeList = root.SelectNodes(pattern)

        '*** Reste à les récupérer dans la ListBox.
        For Each ref As XmlNode In nodeList
            recepteur.Items.Add(ref.InnerXml)
        Next

    End Sub

et pour voir, un bouton nommé "btnListBaliIdent", appelant la procédure ci dessus :
    Private Sub btnListBaliIdent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListBaliIdent.Click
        listBalisesIdentiques("settings.xml", "/Ceri/Article", ListBox1)
        listBalisesIdentiques("settings.xml", "/Ceri/Titre", ListBox2)
        'etc...
    End Sub

Pour la première question, et le test du code msdn, déjà le sauver dans le fichier et non la console, pour voir ce qu'il donne.
On voit form1 et form2 : il y a plusieurs formulaires?

Merci cs_christoni 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_christoni
bastien27100 31 Messages postés mardi 18 mai 2010Date d'inscription 8 juin 2011 Dernière intervention - 23 juin 2010 à 16:48
0
Merci
Un très grand merci à toi!

- ta méthode fonctionne parfaitement, elle me charge toutes mes balises titres dans ma listbox titre,
toute mes balise catégories dans ma listbox catégorie... c'est exactement ce que je désiré!

- pour l'autre question, je n'avais même pas fait attention que la balise ne se sauver pas dans le fichier, donc
un doc.Save("settings.xml") qui va avec sont doc.Load("settings.xml") fonctionne beaucoup mieux!
mais il me reste néanmoin un petit problème, celui que je rencontré déjà avec ma fonction, c'est qu'il faudrait que je puisse changer un noeud bien précis, car forcément l'expréssion Xpath ("/Ceri/Titre") va me modifier tout mes titres,je sais que je pourrais ajouter par exemple ("/Ceri/Titre/info")mais ce n'est pas le but d'aller changer mon code à chaque modification d'un noeud(autant le faire directement dans le fichier xml), donc je ne sait pas ce que je pourrais ajouté/modifier à cette expression pour pouvoir sélectionné un noeud bien précis, peut être un index, car avant de cliqué sur le bouton modifier, je dois cliqué sur l'élément que je souhaite modifier dans une listbox, par exemple pour modifier le titre "info", je dois le sélectionné dans ma listbox pour ensuite cliqué sur modifier la mon form2 s'ouvre et m'afficher mon titre donc "info" dans un textbox, je n'est plus qu'a le remplacer et de cliqué sur enregistrer pour qu'il prenne la place de "info" dans mon fichier, mais qu'il ne prenne que la sienne! donc c'est peut être possible avec sont index dans la listbox, ou parce qu'il est sélectionné, on a la propriété selected, voila j'espère avoir était assez clair,
et encore un grand merci à christoni !
Commenter la réponse de bastien27100
bastien27100 31 Messages postés mardi 18 mai 2010Date d'inscription 8 juin 2011 Dernière intervention - 24 juin 2010 à 12:11
0
Merci
j'ai essayer ceci : nodeList = root.SelectNodes("/Ceri/Titre" = Form1.listbox.SelectedItem)
et cela root.SelectNodes("/Ceri/Titre" = Form1.listbox.SelectedIndex)
afin de ne modifier que le noeud dont le titre est sélectionner dans ma listbox, mais sans succès.
si quelqu'un connaît une solution, elle serait la bienvenue, merci
Commenter la réponse de bastien27100

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.