Récupérer contenu d'une balise xml portant le même nom que d'autres

Résolu
bastien27100 Messages postés 31 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 8 juin 2011 - 24 juin 2010 à 14:05
bastien27100 Messages postés 31 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 8 juin 2011 - 25 juin 2010 à 13:48
Bonjour,
voici mon fichier xml nommée "settings.xml" :
<Ceri>
1
<Titre>TEXTE A NE PAS MODIFIER</Titre> 'exemple : je ne veut pas Modifier le contenu De Titre
<Categories>1 Organisation</Categories>
<Theme>1 Compétences </Theme>
<Desc>1 info</Desc>
<Solution>1 logiciel</Solution>
2
<Titre>TEXTE A MODIFIER</Titre> 'exemple : je veut Modifier le contenu De Titre
<Categories>2 Organisation</Categories>
<Theme>2 Compétences </Theme>
<Desc>2 excel</Desc>
<Solution>2 def</Solution>
</Ceri>

mon code :
Dim doc As XmlDocument = New XmlDocument()
doc.Load("settings.xml")

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

nodeList = root.SelectNodes("/Ceri/Titre")' modifie toutes les balises Titre

'Change le titre.
For Each book In nodeList
book.LastChild.InnerText = Form1.Label12.Text + 1 & " " & TXT_BOX4.Text
Next

doc.Save("settings.xml")
End If

Mon problème : mon code modifie le contenu de toutes mes balises portant le même nom, Titre dans cet exemple.

ce que je souhaite : pouvoir Modifier le Titre que je désire sans toucher aux autres.
comment : ???? peut être avec l'index, ou parce qu'il sont charger et sélectionnable dans une listbox, et sont afficher selon la sélection dans des labels.

ce que j'ai essayer : nodeList root.SelectNodes("/Ceri/Titre" Form1.Label7.Text)
nodeList root.SelectNodes("/Ceri/Titre" Form1.Listbox.SelectedItem)
nodeList root.SelectNodes("/Ceri/Titre" Form1.Listbox.SelectedIndex)

résultat : aucune modification ou tous modifier

voilà, merci d'avance de me venir en aide

2 réponses

cs_christoni Messages postés 140 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 1 novembre 2010 7
24 juin 2010 à 21:40
Bonsoir,
ceci en relation avec ton post précédent.
Je vois mal comment recupérer un noeud précis, alors qu'ils peuvent être nombreux à avoir le même nom et tous sur le même plan.
Je serais à ta place, bien que je ne vois cela que de l'extérieur, en premier je structurerais mon fichier xml, genre :
<?xml version="1.0" encoding="utf-8"?>
<Ceri>
  1
    <Titre>ffffffffffffffffff</Titre>
    <Categories>Bureautique</Categories>
    <Logiciel>Word</Logiciel>
    <Desc>logiciel</Desc>
    <Solution>windows</Solution>
  3
    <Titre>VB</Titre>
    <Categories>VB</Categories>
    <Marque.CN>VB</Marque.CN>
    <Desc>VB</Desc>
    <Solution>VB</Solution>
  2
    <Titre>bibi</Titre>
    <Categories>CN</Categories>
    <Marque.CN>Num</Marque.CN>
    <Desc>tel</Desc>
    <Solution>marque</Solution>
</Ceri>

Pour ce faire j'enregistrerais de la façon suivante :
(C'est en dur, pour voir)
Le but est de créer des groupes "Article"
    Private Sub BT_ENREG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_ENREG.Click

        Dim doc As New XmlDocument()
        doc.Load("settings.xml")

        '*** Création du chemin menant à l'élément "racine", pour placer les données
        Dim xmlCeri As XmlElement = CType(doc.SelectSingleNode("./Ceri"), XmlElement)
        Dim xmlArticle As XmlElement
        xmlArticle = doc.CreateElement("Article")
        xmlArticle.InnerText = 10 'Form1.Label12.Text + 1
        xmlCeri.AppendChild(xmlArticle)

        Dim xmlTitre As XmlElement
        xmlTitre = doc.CreateElement("Titre")
        xmlTitre.InnerText = "VB.NET"
        xmlArticle.AppendChild(xmlTitre)
        doc.Save("settings.xml")
        'Etc .......
        Dim xmlSolution As XmlElement
        xmlSolution = doc.CreateElement("Solution")
        xmlSolution.InnerText = "OK"
        xmlArticle.AppendChild(xmlSolution)

        doc.Save("settings.xml")
    End Sub

Évidemment, il faudra modifier l'affichage dans les listBox :
    Private Sub btnListBaliIdent_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnListBaliIdent.Click
        listBalisesIdentiques("settings.xml", "/Ceri/Article/Titre", ListBox1)
        listBalisesIdentiques("settings.xml", "/Ceri/Article/Categories", ListBox2)
        'etc...
    End Sub 

Ensuite, sur le form1, les listbox donneront la position de la sélection qui est aussi celle du noeud dans le xml, sauf si il y a tri.
    Public posiY As Integer
    Private Sub ListBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
        posiY = ListBox2.SelectedIndex + 1
    End Sub

Enfin l'enregistrement.
Ici on utilise Linq, je n'ai pas trouvé l'équivalent xPath.
Le soucis c'est que, sauf erreur, ce n'est supporté (sauf faire d'énormes bidouilles) qu'à partir de vs 2008.
   Private Sub BT_MODIF_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_MODIF.Click

        Dim testCfg As XElement = XElement.Load("settings.xml")
        Dim noeud As XElement testCfg.XPathSelectElement("Article[position() " & posiY & "]/Titre")
        noeud.Value = "Bonjour" 'TXT_BOX4.Text

        testCfg.Save("settings.xml")
    End Sub

C'est toujours en dur, il faut tester avec tes textbox,radioboutons etc... pour voir si ça fonctionne.
3
bastien27100 Messages postés 31 Date d'inscription mardi 18 mai 2010 Statut Membre Dernière intervention 8 juin 2011
25 juin 2010 à 13:48
encore une fois merci à toi la modification particulière marche très bien
il me reste un petit problème, quand je créer une fiche avec cette nouvelle méthode d'écriture, elle arrive bien dans mon fichier xml, mais n'est pas charger dans mes listbox à cause de ceci :xmlns qui s'introduit dans mes balises :


<Num xmlns="5">5</Num>
<Titre xmlns="5">sa marche</Titre>
<Solution xmlns="5">merci</Solution>
<Desc xmlns="5">à</Desc>
<Marque.Variateur xmlns="5">christoni</Marque.Variateur>
<Categories xmlns="4">Variateurs</Categories>


quand je les supprimes directement de mon fichier xml, ma listbox se charge à nouveau, mais j'aimerai qu'il n'aparaissent pas du tout pour charger mes listbox correctement, existe t'il un moyen pour quelles n'apparaissent pas dans mon fichier?
encore merci de m'accorder du temps pour me venir en aide
0
Rejoignez-nous