bastien27100
Messages postés31Date d'inscriptionmardi 18 mai 2010StatutMembreDernière intervention 8 juin 2011
-
22 juin 2010 à 15:39
bastien27100
Messages postés31Date d'inscriptionmardi 18 mai 2010StatutMembreDernière intervention 8 juin 2011
-
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
' 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
cs_christoni
Messages postés140Date d'inscriptionmardi 25 novembre 2003StatutMembreDernière intervention 1 novembre 20107 23 juin 2010 à 15:04
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?
bastien27100
Messages postés31Date d'inscriptionmardi 18 mai 2010StatutMembreDernière intervention 8 juin 2011 23 juin 2010 à 16:48
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 !
bastien27100
Messages postés31Date d'inscriptionmardi 18 mai 2010StatutMembreDernière intervention 8 juin 2011 24 juin 2010 à 12:11
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