Lire, modifier et crée un fichier XML sous VB.net 2008 - Le retour

Signaler
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013
-
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013
-
Bonjour à tous


Pour ceux qui me connaisse déjà, mon projet avance mais suite a (enfin)
une réunion pour établir (enfin) un cahier des charges. J'ai quelques
modification a apporter a mon programme, surtout en ce qui concerne les
fichiers XML. Ce que j'avais modifié avec une grand aide de"[auteur/MAYZZ/85589.aspx Mayzz]", qui m'avais crée un morceau de code. Malheureusement ne conviens plus.

Voici le code XML sur lequel je doit travailler(ce sera de ce format la):
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
<?xml version= '1.0' encoding="utf-8" ?>

    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
    <SeuilInter>0</SeuilInter>
     
     
    <nom>U Util</nom>
    <Obj>RDAT/5_1/</Obj>
    4
    <Format>100</Format>
    V
    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
    <SeuilInter>0</SeuilInter>
     
    </mesures>
    <entrees>
     
          <nom>CFD</nom>
     <Obj>RDAT/9_1/</Obj>
    9
    <Format>100</Format>
    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
     
     
          <nom>Alarm</nom>
     <Obj>RDAT/8_1/</Obj>
    8
    <Format>100</Format>
    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
     
    </entrees>
  </type>
  <type version ="ACMi1000">
    <mesures>
     
    <nom>U Batterie</nom>
    <Obj>RDAT/5_1/</Obj>
    2
    <Format>100</Format>
    V
    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
    <SeuilInter>0</SeuilInter>
     
     
    <nom>I Batterie</nom>
    <Obj>RDAT/6_1/</Obj>
    3
    <Format>100</Format>
    A
    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
    <SeuilInter>0</SeuilInter>
     
     
    <nom>U Util</nom>
    <Obj>RDAT/5_1/</Obj>
    4
    <Format>100</Format>
    V
    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
    <SeuilInter>0</SeuilInter>
     
    </mesures>
    <entrees>
     
          <nom>CFD</nom>
     <Obj>RDAT/9_1/</Obj>
    9
    <Format>100</Format>
    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
     
     
          <nom>Alarm</nom>
     <Obj>RDAT/8_1/</Obj>
    8
    <Format>100</Format>
    <Selection>false</Selection>
    <SelectInter>false</SelectInter>
     
    </entrees>
  </type>

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Et voici le bout de code que j'ai commencé:

   Function Load(ByVal filename As String) As Collection
        '
        Try
            Dim i As Integer = 0
            'Dim resul As Integer
            Dim Coll As XmlDocument = New XmlDocument
            Coll.Load(filename)
            Dim navigateur As XPathNavigator = Coll.CreateNavigator()
                   'La je veux récupérer tout les information qui concerne l'ACM1000 / mesures /item
            Dim noeuds As XPathNodeIterator = navigateur.Select("/config/type[@version='ACM1000']/mesures/item")
            While noeuds.MoveNext()
                Dim Nom, Type, Obj, Ind, Format, Unit, Selection, SelectInter, SeuilInter As String
                       'Voila ce que je veux obtenir a savoir remplir mes variables correspondante puis remplir ma collection.                       Nom                        Type                       Obj                        Ind                       Format                        Unit                       Selection                        SelectInter
                       SeuilInter =
                       'Ma collection
                       'Ici remplissage de ma collection avec toute les variables

            End While
        Catch e As Exception
            MsgBox("erreur")
            Return Nothing
        End Try
    End Function

Voila, j'ai comme vous prouver voir tester avec les XPath
Et la j'essaie avec DOM
Mais a chaque fois j'ai du mal. Avec Xpath j'arrive pas à parcourir tout les données enfant de "item"
On pensais a définir le select directement dans item/nom puis item/Obj etc... sa marche mais c'est lourd.

Et pour le moment en utilisation de DOM j'arrive a parcourir les noeud mais pas a recuperer les données

Merci de votre aide

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.

11 réponses

Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Salut ;O)

Tu as donc un format d' XML déja existant ? Tu ne peux donc pas créer toi même ton propre shéma xml si je comprend bien ? Donc la serialisation n'est plus possible ?

                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

Bonjour, Mayzz

Je dirais pas que je l'ai déjà existant mais ou peut conciderer tout comme car il m'impose se format. Mais il faut que je le crée a la mimine. Par contre je doit pouvoir le faire évoluer de mon logiciel.
Votre précédente proposition, après quelque légère modification, marchais très bien et j'arrivais à faire ce que je voulais.
le problème c'est que suite a la réunion quelques éléments ont changés. et notamment dans le déroulement du logiciel il doit être possible de sauvegarder les modifications et sélection faite pour évite a l'opérateur de tout sélectionner. La sauvegarde devra donc utilisé la même architecture XML.
Avec la précédente version j'avais 2 fichier par système multiplié par le nombre de système, maintenant il m'en faut qu'un seul fichier XML avec tout dedans comme on retrouve avec mon exemple de XML si dessus. La j'en ai mis que 2 mais j'en ai 6 systèmes diffèrents.

Donc il faut que je puisse recuperer mes données corespondante au system selectionner que je stock dans une voir 2 collection (mon maitre de stage préfèrerais 1 collection, mais moi je préfère 2 collections pour séparer les mesures analogique et les autres qui sont tout ou rien. Je doit pourvoir le modifier (ajouter ou enlever des données dans chaque système)  par contre pas ajouter de nouveau systèmes.
Et enfin je doit pouvoir récupérer ma ou mes collections pour crée un nouveau XML que je peut sauvegarder pour le recharger plutard dans ce fichier XML il peut trés bien y avoir que 1 seul système avec donc ces mesures et entrée.

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

Bonjour,

Je suis arriver a quelque chose pour la lecture de mon fichier XML:
***************************************************
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Nom, Type, Obj, Ind, Format, Unit, Selection, SelectInter, SeuilInter As String
        Dim Typ As XmlNode
        Dim Types As XmlNode
        Dim Items As XmlNode
        Doc = New Xml.XmlDocument
        Doc.Load("f:\essaie1.xml")
        ListXml = Doc.GetElementsByTagName("type")
        For Each Typ In ListXml
            If Typ.Attributes("version").Value = "ACM1000" Then
                For Each Types In Typ
                    If Types.LocalName = "mesures" Then
                        For Each Items In Types
                            Nom = Items.SelectSingleNode("nom").InnerText
                            Type = "mesure"
                            Obj = Items.SelectSingleNode("Obj").InnerText
                            Ind = Items.SelectSingleNode("Ind").InnerText
                            Format = Items.SelectSingleNode("Format").InnerText
                            Unit = Items.SelectSingleNode("Unit").InnerText
                            Selection = Items.SelectSingleNode("Selection").InnerText
                            SelectInter = Items.SelectSingleNode("SelectInter").InnerText
                            SeuilInter = Items.SelectSingleNode("SeuilInter").InnerText
                            'Ici incrementation de ma variable collection des mesures
                            ''                 "
                            ''                 "
                            ''                 "
                            ''                 "
                        Next
                    End If
                    If Types.LocalName = "entrees" Then
                        For Each Items In Types
                            Nom = Items.SelectSingleNode("nom").InnerText
                            Obj = Items.SelectSingleNode("Obj").InnerText
                            Ind = Items.SelectSingleNode("Ind").InnerText
                            Selection = Items.SelectSingleNode("Selection").InnerText
                            SelectInter = Items.SelectSingleNode("SelectInter").InnerText
                            'Ici incrementation de ma variable collection des entrees
                            ''                 "
                            ''                 "
                            ''                 "
                            ''                 "
                        Next
                    End If
                Next
            End If
        Next
    End Sub
*******************************************************************

La cela marche bien, je récupère bien mes données. Reste à les stocker dans une collection.

Et ensuite la modification et la création.

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

J'ai oublier en déclaration j'ai bien sur sa aussi, avant la fonction Load
    Dim Doc As XmlDocument
    Dim ListXml As XmlNodeList

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

Une chose importante aussi, il faut que je puisse classer les données dans l'ordre alphabétique par rapport au nom

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
37
Salut megamario,

Il te faut créer une classe avec des propriétés (Obj, Ind; Format, Mesure), et instacier une collection de cette classe List (Of MyClass)

Ainsi tu aura une collection d'objet avec des propriétés et chaque antité représentera une donnée de ton XML

Dim DataColl As New List(Of MyClass)'Instancie une collection de type MyClass

Dim nClass As MyClass 'crée un nouvelle instance de MyClass 

'Rempli les valeur de cette instance
nClass.Obj = "Tata"
nClass.Ind = 1
nClass.Format = "Toto"
nClass.Mesure = 0.1

DataColl.Add nClass 'Ajout de l'instance à la collection.

@+ Mayzz
                                                                              
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer. <
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

Bonjour

[../auteur/MAYZZ/85589.aspx Mayzz]



[../auteur/MAYZZ/85589.aspx
]


J'y suis enfin arrivé, je retrouve un peut ce qui tu viens de me proposé, en tout cas maintenant ma collection marche
mais j'ai toujours un souci, décidément je suis pas bon :(

J'arrive bien a crée mes collections à partir du XML, à les lires et à  ajouter  manuellement un ensemble de données (représentant par exemple un nouvelle mesure) pas de souci la dessus, mais j'arrive pas a ajouté dans le fichier XML existant cette nouvelle mesures. J'arrive a crée un nouveau fichier grâce à la fonction SAVE().
Et tout sa pas bien si j'utilise la fonction WriteAllText() mais cela n'implémente pas le fichier.

voici ce que je voudrais ajouter donc a mon fichier
                     Co = New Items                  'Items etant ma classe pour la collection
                            Co = CollMesure(k)      'k etant la clef de mon Hashtable CollMesure
                            Dim Aj As XElement = _
                           
                                <Nom><%= Co.Nom %></Nom>
                                <Obj><%= Co.Obj %></Obj>
                                <%= Co.Ind %>
                                <Format><% = Co.Format.ToString %></Format>
                                <%= Co.Unit %>
                                <Selection><% = Co.Selection.ToString %></Selection>
                                <SelectInter><%= Co.SelectInter.ToString %></SelectInter>
                                <SeuilInter><%= Co.SeuilInter.ToString %></SeuilInter>
                           
Je vais essayer de me placer dans le fichier a l'aide de Xpath pour le moment j'ai essayer avec DOM mais c'est pas concluant ;)

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

Bonjour à vous,

Arff pas de net ce week-end :(
Bon du coup je reprend mon problème du boulot.

J'arrive toujours pas a ajouter un noeud dans mon fichier XML, mais il y a une chose que j'ai déjà peut être pas compris:
L'écriture se fait en live ou pas? Je m'explique, peut t'on modifier directement le fichier XML ou faut t'il le charger puis le modifier puis le réenregistrer. je pense que c'est déjà pour sa que je comprend pas tout.

Pourtant cela parait simple en regardant les tuto mais je doit etre vraiment mauvais ;).

Merci de votre aide

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

Personne pour m'aider  s'il vous plais, je suis vraiment bloquer avec sa.

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
46
salut,
l'aide apportée ici ne correspond pas??

http://www.vbfrance.com/forum/sujet-PARCOURIR-COLLECTION-ECRITURE-LECTURE-MODIFICATION_1333397.aspx
Messages postés
146
Date d'inscription
lundi 15 juin 2009
Statut
Membre
Dernière intervention
14 février 2013

Bonjour "PCPT"

J'ai essayé de chercher avec votre aide, mais je n'y arrivais pas, je suis partie avec une Hastable + une classe pour mes collection.
Et puis j'avoue que comme j'ai réussi avec mon hastable je suis plus retourner par la suite pour bien me concentrer sur la partie XML.

En tout cas je viens de reussir, c'est peut etre pas le plus simple car j'ai commencer a regarder du coté de LINQ to XML et cela semble plus facile de comprehension.
En tout cas voici mon code:

    Public Sub WriteXML(ByVal filename As String, ByVal VerSup As String, ByVal Tp As String, ByVal k As String)
        Try
            Dim Elem, ElNom, ElObj, ElInd, ElFormat, ElUnit, ElSelection, ElSelectInter, ElSeuilInter As XmlElement
            Dim Typ, Types As XmlNode
            Doc = New Xml.XmlDocument
            Doc.Load(filename)
            Dim root As XmlNode = Doc.DocumentElement
            ListXml = Doc.GetElementsByTagName("type")
            Dim Co As Items = CollMesure(k) ' Initialisation de la collection. Items etant ma classe            If Tp "entrees" Then Co CollEntree(k)
            For Each Typ In ListXml
                If Typ.Attributes("version").Value = VerSup Then
                    For Each Types In Typ
                        If Types.LocalName = Tp Then
                            Elem = Doc.CreateElement("item")
                            ElNom = Doc.CreateElement("Nom")
                            ElObj = Doc.CreateElement("Obj")
                            ElInd = Doc.CreateElement("Ind")
                            ElFormat = Doc.CreateElement("Format")
                            ElUnit = Doc.CreateElement("Unit")
                            ElSelection = Doc.CreateElement("Selection")
                            ElSelectInter = Doc.CreateElement("SelectInter")
                            ElSeuilInter = Doc.CreateElement("SeuilInter")
                            ElNom.InnerText = Co.Nom
                            ElObj.InnerText = Co.Obj
                            ElInd.InnerText = Co.Ind
                            ElFormat.InnerText = Co.Format
                            ElUnit.InnerText = Co.Unit
                            ElSelection.InnerText = Co.Selection
                            ElSelectInter.InnerText = Co.SelectInter
                            ElSeuilInter.InnerText = Co.SeuilInter
                            Elem.AppendChild(ElNom)
                            Elem.AppendChild(ElNom)
                            Elem.AppendChild(ElObj)
                            Elem.AppendChild(ElInd)
                            Elem.AppendChild(ElFormat)
                            Elem.AppendChild(ElUnit)
                            Elem.AppendChild(ElSelection)
                            Elem.AppendChild(ElSelectInter)
                            Elem.AppendChild(ElSeuilInter)
                            Types.InsertAfter(Elem, Types.LastChild)
                        End If
                    Next
                End If
            Next
            Doc.Save(filename)
        Catch ex As Exception
            MsgBox("Erreur d'ecriture")
        End Try
    End Sub

Technicien en électricité industriel. En cours de reconversion par un BTS IRIS 1er année.
Actuellement en stage dans mon entreprise en R&D.