Modifier un fichier xml [Résolu]

Messages postés
15
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
11 février 2008
- 4 févr. 2008 à 09:34 - Dernière réponse :
Messages postés
26
Date d'inscription
dimanche 3 mai 2009
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?
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
4 févr. 2008 à 10:49
3
Merci
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

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Renfield
Meilleure réponse
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
4 févr. 2008 à 18:14
3
Merci
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

Merci Kevin.Ory 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Kevin.Ory
Messages postés
15
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
11 février 2008
4 févr. 2008 à 10:59
0
Merci
ok merci je vais voir ça et vous tiens au courant.
Commenter la réponse de DiamonDonald
Messages postés
843
Date d'inscription
mercredi 22 octobre 2003
Dernière intervention
7 janvier 2009
4 févr. 2008 à 11:19
0
Merci
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")
Commenter la réponse de Kevin.Ory
Messages postés
15
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
11 février 2008
4 févr. 2008 à 15:11
0
Merci
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 !
Commenter la réponse de DiamonDonald
Messages postés
15
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
11 février 2008
5 févr. 2008 à 09:41
0
Merci
merci beaucoup, cela me sera très utile car c'est un très bon exemple et simple à comprendre.
Commenter la réponse de DiamonDonald
Messages postés
15
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
11 février 2008
6 févr. 2008 à 16:40
0
Merci
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
Commenter la réponse de DiamonDonald
Messages postés
15
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
11 février 2008
7 févr. 2008 à 10:58
0
Merci
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 !!
Commenter la réponse de DiamonDonald
Messages postés
15
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
11 février 2008
7 févr. 2008 à 11:14
0
Merci
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"
Commenter la réponse de DiamonDonald
Messages postés
15
Date d'inscription
lundi 28 janvier 2008
Dernière intervention
11 février 2008
8 févr. 2008 à 16:19
0
Merci
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
Commenter la réponse de DiamonDonald
Messages postés
26
Date d'inscription
dimanche 3 mai 2009
Dernière intervention
4 mars 2010
23 févr. 2010 à 15:16
0
Merci
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?
Commenter la réponse de goredo
Messages postés
26
Date d'inscription
dimanche 3 mai 2009
Dernière intervention
4 mars 2010
23 févr. 2010 à 15:20
0
Merci
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...
Commenter la réponse de goredo

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.