Modifier un fichier xml

Résolu
DiamonDonald Messages postés 15 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 11 février 2008 - 4 févr. 2008 à 09:34
goredo Messages postés 26 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 4 mars 2010 - 23 févr. 2010 à 15:20
Bonjour,

Je débarque sous vb et xml et j'ai un petit problème. je dois pouvoir modifier un fichier xml (certains paramètres bien précis) mais je ne vois pas trop comment je pourrai faire à partir de vb.net. j'aurai bien une idée du genre: rechercher dans le fichier, en le parcourant du début à la fin, et remplacer ou ajouter aux endroits qu'il faut mais je ne vois pas comment je peux faire...

Quelqu'un pourrait m'aider SVP?

12 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
4 févr. 2008 à 10:49
voir espace de nom XML

http://www.google.fr/search?source=ig&hl=fr&rlz=&q=msdn+xml+namespace&meta=

Renfield
Admin CodeS-SourceS- MVP Visual Basic
3
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
4 févr. 2008 à 18:14
Je comprend pas. Qu'appel-tu lire un XML dans une MsgBox?

Je te met un exemple complet partant de mon message précédent:

1. On a le fichier XML suivant:

<?xml version= "1.0" encoding="utf-8" ?>

    <voiture>
        Ferrari
        Renault
        Toyota
    </voiture>
    <camion>
        Iveco
        Renault
    </camion>

2. On créé une Form avec:

Un ComboBox qui servira à choisir entre voiture et camion
Une ListView avec 3 collones qui permetra d'afficher les voitures ou les camions
Un Button qui permetra de changer le poid d'un véhicule

3. Et on ajoute ce code:

' Le document XML
Private doc As New Xml.XmlDocument  

' Chargement de Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ' Charger le document XML
    doc.Load("C:\essai.xml")

    ' Ajouter les sections enfants du document à la ComboBox (dans notre cas, voiture et camion)
    For Each elem As Xml.XmlElement In doc.DocumentElement
        ComboBox1.Items.Add(elem.Name)
    Next
End Sub

' Sélection d'un élément de ComboBox1
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    ' Nettoyer la liste ListView1  
    ListView1.Items.Clear()

    ' Parcourir les enfants de la section sélectionné dans la ComboBox1
    For Each elem As Xml.XmlElement In doc.DocumentElement(ComboBox1.Text).ChildNodes
        Dim item As ListViewItem = ListView1.Items.Add(elem.InnerText)   ' Nom de la voiture
        item.SubItems.Add(elem.GetAttribute("poid"))                                   ' Poid
        item.SubItems.Add(elem.GetAttribute("puissance"))                           ' Puissance
    Next
End Sub

' Clique sur le bouton
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ' Vérifier qu'un élément est sélectionné dans la ListView1
    If ListView1.SelectedItems.Count > 0 Then

       ' Afficher un InputBox pour spécifier la nouvelle valeur du poid
        Dim res As String = InputBox("Entrer le poid de ce véhicule:" & vbCrLf & vbCrLf & ListView1.SelectedItems(0).Text)
        If res <> "" Then
            ' Retrouver l'élément XML correspondant à la sélection dans ComboBox1 et ListView1
            ' Cette fois ci on accède aux éléments par index , pas par le nom comme dans la
            ' procédure ComboBox1_SelectedIndexChanged (les 2 solutions sont possible)
            Dim elem As Xml.XmlElement = doc.DocumentElement.ChildNodes(ComboBox1.SelectedIndex).ChildNodes(ListView1.SelectedIndices(0))
            ' On modifie l'attribut "poid" de l'élément du document XML
            elem.SetAttribute("poid", res & " tonnes")
            ' Egalement modifier l'élément de la ListView1
            ListView1.SelectedItems(0).SubItems(1).Text = res & " tonnes"
            ' Enregistrer les modifications du document XML
            doc.Save("C:\essai.xml")
        End If

    End If
End Sub

4. Ce qui donne:

5. Conclusion:

On a vu comment
- ouvrir et enregistrer un document XML
- accéder au éléments de la structure XML (nodes) soit par nom, soit par index
- lire et modifier des attributs/valeurs d'éléments

J'espère que ca te sera utile
3
DiamonDonald Messages postés 15 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 11 février 2008
4 févr. 2008 à 10:59
ok merci je vais voir ça et vous tiens au courant.
0
Kevin.Ory Messages postés 840 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 7 janvier 2009 11
4 févr. 2008 à 11:19
Salut,

' 1° Ouvrir le document XML:
Dim Doc as Xml.XmlDocument
Doc.Load("C:\Fichier.xml")

' 2° Faire les modifs

' 3° Enregister le document
Doc.Save("C:\Fichier.xml")
0

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

Posez votre question
DiamonDonald Messages postés 15 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 11 février 2008
4 févr. 2008 à 15:11
merci pour vos réponses. j'ai trouvé mon bonheur ici :
http://www.vbfrance.com/codes/APPLICATION-LIRE-FAIRE-AJOUT-DANS-FICHIER-XML_30680.aspx

toutefois il me reste d'autres petites questions.

Donc j'arrive maintenant à ouvrir et lire mon fichier XML mais la lecture s'effectue dans des MsgBox, et pour passer tous les éléments il me faut cliquer à chaque fois sur le bp "OK". Il n'y aurait pas une autre commande qui permet l'affichage mais avec une barre de défilement, par exemple?
Ou alors, le fichiers XML que j'utilise comporte plusieurs "sections", est-il possible d'y accéder directement plutot que d'afficher  la totalité du code?

Merci d'avance !
0
DiamonDonald Messages postés 15 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 11 février 2008
5 févr. 2008 à 09:41
merci beaucoup, cela me sera très utile car c'est un très bon exemple et simple à comprendre.
0
DiamonDonald Messages postés 15 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 11 février 2008
6 févr. 2008 à 16:40
en recherchant encore sur le net, j'ai vu que l'on pouvait accéder aux éléments par la synthaxe "XPath", mais comment ça marche? j'ai regardé des tuto mais je comprend pas comment l'utiliser... j'ai du mal à me mettre dans le bain
0
DiamonDonald Messages postés 15 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 11 février 2008
7 févr. 2008 à 10:58
Bonjour

j'ai tout de même un problème lors de la lecture des attributs de mon fichier XML

voici la structure d'un petit morceau du fichier :

   
       
        

   

dans mon code j'utilise la même méthode que [auteur/KEVINORY/183467.aspx Kevin.Ory] c'est à dire, à l'ouverture de mon fichier XML, lister les éléments dans une comboBox et lors de la sélection d'un de ces éléments, afficher les attributs et leur valeur dans une listview.
 voici mon code pour cette partie :

    '----------------Déclaration
des variables XML---------------------'

    Private documentXML As
XmlDocument

    Private noeuxRacine, noeuxEnf As XmlNode

    Private EnfantNoeux As
XmlNodeList

 

    Private elementXML As
XmlElement

    Private attribCollecXML As
XmlAttributeCollection

    '-----------------------------------------'

    PrivateSub
ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles
ComboBox1.SelectedIndexChanged

       
ListView1.Items.Clear()

 

       
EnfantNoeux = documentXML.GetElementsByTagName("IOConf")

 

        ForEach elementXML In noeuxRacine(ComboBox1.Text).ChildNodes

            ForEach noeuxEnf In EnfantNoeux

                 If
noeuxEnf.LocalName = "PLC"Then

                    Dim item As
ListViewItem = ListView1.Items.Add(elementXML.Name)

                   
item.SubItems.Add(elementXML.GetAttribute("autoRun"))

                   
item.SubItems.Add(elementXML.GetAttribute("MWInitZero"))

                   
item.SubItems.Add(elementXML.GetAttribute("numberInternalWord"))

                   
item.SubItems.Add(elementXML.GetAttribute("numberConstantWord"))

                   
item.SubItems.Add(elementXML.GetAttribute("numberInternalBit"))

                      End If

            Next

        Next

    EndSub

<!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:471pt;
height:95.25pt'>
<v:imagedata src="file:///D:\DOCUME~1\sffd921.000\LOCALS~1\Temp\msohtml1\01\clip_image001.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->sauf que je n'arrive à afficher uniquement que "PLC" et non les attributs...

qu'est ce que j'ai mal ou fait ou pas fait???

please Help !!
0
DiamonDonald Messages postés 15 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 11 février 2008
7 févr. 2008 à 11:14
pardon une petite précrision sur le code ci-dessus, ne pas prendre en compte pour le moment le test "   If noeuxEnf.LocalName = "PLC"Then end if"
0
DiamonDonald Messages postés 15 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 11 février 2008
8 févr. 2008 à 16:19
Bon j'ai résolu une partie de mon problème, notament concernant la lecture de mes différents attributs mais c'est pas mal de la bidouille et ça ne me plait pas alors je me penche sur Xpath car je pense que cela solutionnerai efficacement et correctement mes soucis.

pour infos voici les liens que j'utilise pour l'aide sur Xpath :

http://www.csharpfr.com/tutoriaux/XPATH-LANGUAGE_536.aspx

http://www.zdnet.fr/builder/architecture/conception_integration_si/0,39021041,2136916-2,00.htm

http://jerome.developpez.com/xmlxsl/xpath/

si quelqu'un d'autre a des liens complémentaires, je suis preneur
0
goredo Messages postés 26 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 4 mars 2010
23 févr. 2010 à 15:16
bonjour,je trouve cette methode simple et ergonomique pour traiter les differents noeuds de mon xml =)
néamoins je n'arrive pas a faire fonctionner le programme de maniere optimal avec mon xml qui est plus complexe que celui ci...et il me renvoi parfois des erreurs du type :

Impossible d'effectuer un cast d'un objet de type 'System.Xml.XmlComment' en type 'System.Xml.XmlElement'.

quelqu'un aurait une idée?
0
goredo Messages postés 26 Date d'inscription dimanche 3 mai 2009 Statut Membre Dernière intervention 4 mars 2010
23 févr. 2010 à 15:20
heu...il aurait été judicieux de ma part de poster mon xml

<?xml version= "1.0" encoding="utf-8" ?>
<!--        Base de donnee des ferrures et goujons    -->
<!--                                                  -->
<!--        description des objet par Types           -->
<!--                                                  -->
<quincaillerie>
<objet Type="Ferrure">
<Texts>
init
<Language>Fr</Language>
<Dim_A>(A) Dim_A Goujon</Dim_A>
<Dim_B>(B) Profondeur de percage</Dim_B>
<Dim_C>(C) Enfoncement centre de fixation</Dim_C>
<Dim_D>(D) Diametre boitier</Dim_D>
<Dim_E>(E) Dim_B Goujon</Dim_E>
<Dim_F>(F) Dim_C Goujon</Dim_F>
<Dim_G>Epaisseur plaque mini</Dim_G>
</Texts>
<Ref>262.26.246</Ref>
<Modele>Boitier Minifix 15-34</Modele>
 minifix15.jpg 
<FileObject>FichFerrure.ipt</FileObject>
<TypeFerrure>1</TypeFerrure>
<ValDim_A>0.0</ValDim_A>
<ValDim_B>13.5</ValDim_B>
<ValDim_C>9.0</ValDim_C>
<ValDim_D>15.0</ValDim_D>
<ValDim_E>0.0</ValDim_E>
<ValDim_F>0.0</ValDim_F>
<ValDim_G>16.0</ValDim_G>
<NbPercages>3</NbPercages>
<!--        percage                                          -->


<X>34.0</X>
<Y>0.0</Y>
<Z>0.0</Z>


<Diametre>15.0</Diametre>
13.5


0.0
<VecteurPercage>
<VX>0.0</VX>
<VY>0.0</VY>
<VZ>-1.0</VZ>
</VecteurPercage>


<!--        percage                                          -->


<X>0.0</X>
<Y>0.0</Y>
<Z>-10.0</Z>


<Diametre>3.5</Diametre>
8.0


120.0
<VecteurPercage>
<VX>-1.0</VX>
<VY>0.0</VY>
<VZ>0.0</VZ>
</VecteurPercage>


<!--        percage                                          -->


<X>0.0</X>
<Y>0.0</Y>
<Z>-10.0</Z>


<Diametre>3.5</Diametre>
34.0


120.0
<VecteurPercage>
<VX>1.0</VX>
<VY>0.0</VY>
<VZ>0.0</VZ>
</VecteurPercage>


</objet>
<!--                                                  -->
<!--        Ferrure minifix                           -->
<!--                                                  -->
<objet Type ="Ferrure">
<Texts>
init
<Language>Fr</Language>
<Dim_A>(A) Dim_A Goujon</Dim_A>
<Dim_B>(B) Profondeur de percage</Dim_B>
<Dim_C>(C) Enfoncement centre de fixation</Dim_C>
<Dim_D>(D) Diametre boitier</Dim_D>
<Dim_E>(E) Dim_B Goujon</Dim_E>
<Dim_F>(F) Dim_C Goujon</Dim_F>
<Dim_G>Epaisseur plaque mini</Dim_G>
</Texts>
<Ref>262.26.247</Ref>
<Modele>Boitier Minifix 20-20</Modele>
minifix15.jpg
<FileObject>FichFerrure.ipt</FileObject>
<TypeFerrure>1</TypeFerrure>
<ValDim_A>0.0</ValDim_A>
<ValDim_B>13.5</ValDim_B>
<ValDim_C>9.0</ValDim_C>
<ValDim_D>15.0</ValDim_D>
<ValDim_E>0.0</ValDim_E>
<ValDim_F>0.0</ValDim_F>
<ValDim_G>16.0</ValDim_G>
<NbPercages>3</NbPercages>
<!--        percage                                          -->


<X>20.0</X>
<Y>0.0</Y>
<Z>0.0</Z>


<Diametre>20.0</Diametre>
13.5


0.0
<VecteurPercage>
<VX>0.0</VX>
<VY>0.0</VY>
<VZ>-1.0</VZ>
</VecteurPercage>


<!--        percage                                          -->


<X>0.0</X>
<Y>0.0</Y>
<Z>-10.0</Z>


<Diametre>4.5</Diametre>
20.0


120.0
<VecteurPercage>
<VX>1.0</VX>
<VY>0.0</VY>
<VZ>0.0</VZ>
</VecteurPercage>


<!--        percage                                          -->


<X>0.0</X>
<Y>0.0</Y>
<Z>-10.0</Z>


<Diametre>4.5</Diametre>
8.0


120.0
<VecteurPercage>
<VX>-1.0</VX>
<VY>0.0</VY>
<VZ>0.0</VZ>
</VecteurPercage>


</objet>
 </quincaillerie>


cet extrait doit suffir a mettre en place la structure...j'arrive à y mettre des item de mon xml mais ceux ci sont mal declaré ou organisé...peu etre est ce du a une mauvais parcours de mes noeuds...
0
Rejoignez-nous