Ajout de noeuds dans un fichier XML

Résolu
quentin22breizh - 20 août 2014 à 20:52
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 23 août 2014 à 20:03
Bonjour à tous,

Je me permets de venir vers vous pour un petit souci en VB. En effet, je travaille sur un fichier XML et je dois ajouter deux fois le même nom mais je n'y arrive pas. Il m'écrase le précédent. Je vous joins l'objectif à atteindre en sachant que je ne veux pas raisonner sur deux lignes seulement.
<variables name="E_BUMPERS_OK" typeName="EBOOL" topologicalAddress="%I0.1.3">
			<comment>E_BUMPERS_OK</comment>
			<attribute name="TimeStampCapability" value="0"></attribute>
			<attribute name="TimeStampSource" value="0"></attribute>
		</variables>
		<variables name="TAB_ANIM_TOR" typeName="ARRAY[0..99] OF INT" topologicalAddress="%MW800">
			<attribute name="TimeStampSource" value="3"></attribute>
		</variables>
		<variables name="E_BP_NAVETTE_AR" typeName="EBOOL" topologicalAddress="%I0.1.11">
			<comment>RECUL_NAVETTE_BOITIER_1PC1</comment>
			<attribute name="TimeStampCapability" value="0"></attribute>
			<attribute name="TimeStampSource" value="0"></attribute>
		</variables>


Merci d'avance pour votre aide

5 réponses

jordane45 Messages postés 38137 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
20 août 2014 à 22:24
Bonjour.
L'objectif. ..c'est bien.... le code que TU utilises. .c'est mieux. ..
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
20 août 2014 à 23:08
Et comme tu avais posté deux fois le message en VB6 et en VB.Net, dans quel langage?
0
quentin22breizh
21 août 2014 à 09:18
Bonjour à tous les deux,

Je travail sous Visual Studio 2013. Je vous joins un bout de code que j'utilise pour vous aiguiller un poil plus:

'Création du fichier XML de sortie
        Dim XmlDoc As XmlDocument = New XmlDocument()

        'Création  du fichier
        XmlDoc.LoadXml("<STExchangeFile></STExchangeFile>")

        Dim oCreation = XmlDoc.CreateProcessingInstruction("xml", "version='1.0' encoding='UTF-8'standalone ='yes'")
        XmlDoc.InsertBefore(oCreation, XmlDoc.ChildNodes.Item(0))

        'Création des noeuds
        Dim ElemfileHeader As XmlElement = XmlDoc.CreateElement("fileHeader") 'ElemfileHeader pour le noeud [fileHeader][/fileHeader]
        Dim ElemcontentHeader As XmlElement = XmlDoc.CreateElement("contentHeader") 'ElemcontentHeader pour le noeud [contentHeader][/contentHeader]
        Dim Elemprogram As XmlElement = XmlDoc.CreateElement("program") 'Elemprogram pour le noeud [program][/program]
        Dim ElemidentProgram As XmlElement = XmlDoc.CreateElement("identProgram") 'ElemidentProgram pour le noeud [identProgram][/identProgram]
        Dim ElemSTSource As XmlElement = XmlDoc.CreateElement("STSource") 'Elemprogram pour le noeud [STSource][/STSource]
        Dim ElemdataBlock As XmlElement = XmlDoc.CreateElement("dataBlock") 'Elemprogram pour le noeud [dataBlock][/dataBlock]
        Dim Elemvariables As XmlElement = XmlDoc.CreateElement("variables") 'Elemprogram pour le noeud [variables][/variables]
        Dim Elemcomment As XmlElement = XmlDoc.CreateElement("comment") 'Elemprogram pour le noeud [comment][/comment]
        Dim Elemattribute_1 As XmlElement = XmlDoc.CreateElement("attribute") 'Elemprogram pour le noeud [attribute][/attribute]
        Dim Elemattribute_2 As XmlElement = XmlDoc.CreateElement("attribute") 'Elemprogram pour le noeud [attribute][/attribute]

        'En-tête du fichier à ne pas modifier
        'Ajout des attributs pour l'élément "fileHeader"
        ElemfileHeader.SetAttribute("company", "Schneider Automation")
        ElemfileHeader.SetAttribute("product", "Unity Pro XL V8.0 - 131118")
        ElemfileHeader.SetAttribute("dateTime", "date_and_time#2014-8-20-10:19:36")
        ElemfileHeader.SetAttribute("content", "Fichier source ST")
        ElemfileHeader.SetAttribute("DTDVersion", "41")

        'Ajout des attributs pour l'élément "contentheader"
        ElemcontentHeader.SetAttribute("name", "Station")
        ElemcontentHeader.SetAttribute("version", "0.0.388")
        ElemcontentHeader.SetAttribute("dateTime", "date_and_time#2014-6-10-15:32:22")

        'Remplissage du noeud STSource
        ElemSTSource.InnerText = "(*ANIMATION TOR*)" + vbCrLf + "(*ANIMATION ENTREES TOR *)" + vbCrLf

        For index_1 = 0 To Nblignes
            ElemSTSource.InnerText = ElemSTSource.InnerText + tab(index_1, Nbcolonnes) + ":=" + tab(index_1, 2) + ";" + vbCrLf
        Next


        'Partie à modifier
        For i As Integer = 0 To 2
            'Ajout des balises enfants à la balise datablock
            ElemdataBlock.AppendChild(Elemvariables)
            'Ajout des attributs pour l'élément "variables"
            Elemvariables.SetAttribute("name", "E_RES_1_" & i)
            Elemvariables.SetAttribute("typeName", "EBOOL")
            Elemvariables.SetAttribute("topologicalAddress", "%I0.1.0")

            'Remplissage du noeud "comment"
            Elemcomment.InnerText = "RESERVE"

            'Ajout des balises enfants à la balise variables
            Elemvariables.AppendChild(Elemcomment)
            Elemvariables.AppendChild(Elemattribute_1)
            Elemvariables.AppendChild(Elemattribute_2)

            'Ajout des attributs pour l'élément "attribut_1"
            Elemattribute_1.SetAttribute("name", "TimeStampCapability")
            Elemattribute_1.SetAttribute("value", "0")

            'Ajout des attributs pour l'élément "attribut_2"
            Elemattribute_2.SetAttribute("name", "TimeStampSource")
            Elemattribute_2.SetAttribute("value", "0")
        Next

        'Ajout des balises enfants à la balise program
        Elemprogram.AppendChild(ElemidentProgram)
        Elemprogram.AppendChild(ElemSTSource)


        'Ajout des balises parents au document
        XmlDoc.DocumentElement.AppendChild(ElemfileHeader)
        XmlDoc.DocumentElement.AppendChild(ElemcontentHeader)
        XmlDoc.DocumentElement.AppendChild(Elemprogram)
        XmlDoc.DocumentElement.AppendChild(ElemdataBlock)

        'Sauvegarde du fichier
        XmlDoc.Save(Dossier_fichier & "Animations.xst")
        'libération du fichier pour ouverture depuis notepad

        'Fin du programme
        MessageBox.Show("Génération terminée")
0
quentin22breizh
21 août 2014 à 18:53
Ayant réussi à corriger mon problème tout sul, j'en fait part à la communauté.
Donc, pour ajouter plusieurs noeuds du même nom, j'ai fait comme suis:

For i As Integer = 0 To Nblignes - 1
Dim Elemvariables As XmlElement = XmlDoc.CreateElement("variables") 'Elemprogram pour le noeud [variables]/variables
Dim Elemcomment As XmlElement = XmlDoc.CreateElement("comment") 'Elemprogram pour le noeud [comment]/comment
Dim Elemattribute_1 As XmlElement = XmlDoc.CreateElement("attribute") 'Elemprogram pour le noeud [attribute]/attribute
Dim Elemattribute_2 As XmlElement = XmlDoc.CreateElement("attribute") 'Elemprogram pour le noeud [attribute]/attribute
'Ajout des attributs pour l'élément "variables"
Elemvariables.SetAttribute("name", tab(i, 4))
Elemvariables.SetAttribute("typeName", "EBOOL")
Elemvariables.SetAttribute("topologicalAddress", tab(i, 2))

'Remplissage du noeud "comment"
Elemcomment.InnerText = tab(i, 5)

'Ajout des balises enfants à la balise variables
Elemvariables.AppendChild(Elemcomment)
Elemvariables.AppendChild(Elemattribute_1)
Elemvariables.AppendChild(Elemattribute_2)

'Ajout des attributs pour l'élément "attribut_1"
Elemattribute_1.SetAttribute("name", "TimeStampCapability")
Elemattribute_1.SetAttribute("value", "0")

'Ajout des attributs pour l'élément "attribut_2"
Elemattribute_2.SetAttribute("name", "TimeStampSource")
Elemattribute_2.SetAttribute("value", "0")

'Ajout des balises enfants à la balise datablock
ElemdataBlock.AppendChild(Elemvariables)
Next
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
21 août 2014 à 23:03
Tu peux mettre la discussion Résolue.
0
quentin22breizh Messages postés 34 Date d'inscription mercredi 30 juillet 2014 Statut Membre Dernière intervention 27 avril 2017
22 août 2014 à 10:13
Peux tu m'expliquer comment faire stp? Je suis nouveau sur le forum.

Merci d'avance
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
22 août 2014 à 10:37
En cliquant sur le lien sous le titre de la discussion.
Quand j'aurais un peu de temps je regarderais s'il n'y a pas moyen de "clarrifier" un peu ton code avec Linq to Xml
0

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

Posez votre question
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
23 août 2014 à 20:03
Bonsoir,
je pense avoir fait ce que tu cherches avec Linq To Xml.
D'abord j'ai écrit une classe correspondant à tes données avec une classe par "type" de données dans ton fichier xml, ça n'est pas obligé, mais ça me parait plus clair pour trimballer des données.
Imports System
Imports System.Collections.Generic


Public Class Quentin22breizhDonnees
    Public Sub New()
        DataBlock = New List(Of Variables)()
    End Sub

    Public Property FileHeader() As FichierHeader

    Public Property ContenHeader() As ContenuHeader

    Public Property Program() As Programme

    Public Property DataBlock() As List(Of Variables)
End Class

Public Class FichierHeader
    Public Property Compagnie() As String

    Public Property Produit() As String

    Public Property DateXml() As String
        Get
            Return "date_and_time#" & [Date].ToString("yyyy-MM-dd-HH:mm:ss")
        End Get
        Set(ByVal value As String)
            [Date] = Date.Parse(value.Replace("date_and_time#", ""))
        End Set
    End Property

    Public Property [Date]() As Date

    Public Property Contenu() As String

    Public Property DTDVersion() As String

End Class

Public Class ContenuHeader
    Public Property Nom() As String

    Public Property Version() As String

    Public Property [Date]() As Date

    Public Property DateXml() As String
        Get
            Return "date_and_time#" & [Date].ToString("yyyy-MM-dd-HH:mm:ss")
        End Get
        Set(ByVal value As String)
            [Date] = Date.Parse(value.Replace("date_and_time#", ""))
        End Set
    End Property
End Class

Public Class Programme
    Public Property Identite() As String

    Public Property STSource() As String
End Class

Public Class Variables
    Public Sub New()
        Attributs = New List(Of Attribut)()
    End Sub

    Public Property Nom() As String

    Public Property TypeNom() As String

    Public Property TopologicalAddress() As String

    Public Property Commentaire() As String

    Public Property Attributs() As List(Of Attribut)
End Class

Public Class Attribut
    Public Property Nom() As String

    Public Property Valeur() As String
End Class


Ensuite j'initialise et renseigne une instance de cette classe
        Dim donnees As New Quentin22breizhDonnees()

        donnees.FileHeader = New FichierHeader With {.Compagnie = "Schneider Automation", .Produit = "Unity Pro XL V8.0 - 131118", .Date = Date.Parse("20/08/2014 10:19:36")}

        donnees.ContenHeader = New ContenuHeader With {.Nom = "Station", .Version = "0.0.388", .Date = Date.Parse("10/06/2014 15:32:22")}

        Dim stSource As New StringBuilder()
        stSource.AppendLine("(*ANIMATION TOR*)")
        stSource.AppendLine("(*ANIMATION ENTREES TOR *)")
        stSource.AppendLine("0:=0;")
        stSource.AppendLine("1:=1;")
        stSource.AppendLine("2:=2;")
        donnees.Program = New Programme With {.Identite = "", .STSource = stSource.ToString()}

        Dim variable As Variables = New Variables With {.Nom = "E_BUMPERS_OK", .TypeNom = "EBOOL", .TopologicalAddress = "%I0.1.3", .Commentaire = "E_BUMPERS_OK"}
        variable.Attributs.Add(New Attribut With {.Nom = "TimeStampCapability", .Valeur = "0"})
        variable.Attributs.Add(New Attribut With {.Nom = "TimeStampSource", .Valeur = "0"})
        donnees.DataBlock.Add(variable)

        Dim variable2 As Variables = New Variables With {.Nom = "TAB_ANIM_TOR", .TypeNom = "ARRAY[0..99] OF INT", .TopologicalAddress = "%MW800"}
        variable2.Attributs.Add(New Attribut With {.Nom = "TimeStampSource", .Valeur = "3"})
        donnees.DataBlock.Add(variable2)

        Dim variable3 As Variables = New Variables With {.Nom = "E_BP_NAVETTE_AR", .TypeNom = "EBOOL", .TopologicalAddress = "%I0.1.11", .Commentaire = "RECUL_NAVETTE_BOITIER_1PC1"}
        variable3.Attributs.Add(New Attribut With {.Nom = "TimeStampCapability", .Valeur = "0"})
        variable3.Attributs.Add(New Attribut With {.Nom = "TimeStampSource", .Valeur = "0"})
        donnees.DataBlock.Add(variable3)


Maintenant la méthode qui écrit le xml.
    Private Sub Quentin22breizhXML(ByVal Donnee As Quentin22breizhDonnees)
        Dim xDoc As New XDocument(New XElement("STExchangeFile",
                                               New XElement("fileHeader", New XAttribute("company", Donnee.FileHeader.Compagnie), New XAttribute("product", Donnee.FileHeader.Produit), New XAttribute("dateTime", Donnee.FileHeader.DateXml)),
                                               New XElement("contentHeader", New XAttribute("name", Donnee.ContenHeader.Nom), New XAttribute("version", Donnee.ContenHeader.Version), New XAttribute("dateTime", Donnee.ContenHeader.DateXml)),
                                               New XElement("program", New XElement("identProgram", Donnee.Program.Identite), New XElement("STSource", Donnee.Program.STSource)),
                                               New XElement("dataBlock",
                                                            From variable In Donnee.DataBlock
                                                            Select New XElement("variables", New XAttribute("name", variable.Nom), New XAttribute("topologicalAddress", variable.TopologicalAddress), New XElement("comment", variable.Commentaire),
                                                                From attribut In variable.Attributs
                                                                Select New XElement("attribute", New XAttribute("name", attribut.Nom), New XAttribute("value", attribut.Valeur))))))

        xDoc.Save("Animations.xst")
    End Sub


Que j'appelle comme ça.
Quentin22breizhXML(donnees)


Le résultat.
<?xml version="1.0" encoding="utf-8"?>
<STExchangeFile>
  <fileHeader company="Schneider Automation" product="Unity Pro XL V8.0 - 131118" dateTime="date_and_time#2014-08-20-10:19:36" />
  <contentHeader name="Station" version="0.0.388" dateTime="date_and_time#2014-06-10-15:32:22" />
  <program>
    <identProgram></identProgram>
    <STSource>(*ANIMATION TOR*)
(*ANIMATION ENTREES TOR *)
0:=0;
1:=1;
2:=2;
</STSource>
  </program>
  <dataBlock>
    <variables name="E_BUMPERS_OK" topologicalAddress="%I0.1.3">
      <comment>E_BUMPERS_OK</comment>
      <attribute name="TimeStampCapability" value="0" />
      <attribute name="TimeStampSource" value="0" />
    </variables>
    <variables name="TAB_ANIM_TOR" topologicalAddress="%MW800">
      <comment />
      <attribute name="TimeStampSource" value="3" />
    </variables>
    <variables name="E_BP_NAVETTE_AR" topologicalAddress="%I0.1.11">
      <comment>RECUL_NAVETTE_BOITIER_1PC1</comment>
      <attribute name="TimeStampCapability" value="0" />
      <attribute name="TimeStampSource" value="0" />
    </variables>
  </dataBlock>
</STExchangeFile>



Les avantages que je trouve à cette méthode sont:
-la méthode qui écrit le xml est courte, simple et visuellement on devine le fichier résultat,
-les données sont traitées et contenues dans des classes dédiées ou liste de ces classe bien plus souple et simple d'utilisation qu'un tableau
0
Rejoignez-nous