Ajout de noeuds dans un fichier XML [Résolu]

quentin22breizh - 20 août 2014 à 20:52 - Dernière réponse : Whismeril 12118 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention
- 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
Afficher la suite 

Votre réponse

8 réponses

jordane45 22901 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 octobre 2018 Dernière intervention - 20 août 2014 à 22:24
0
Merci
Bonjour.
L'objectif. ..c'est bien.... le code que TU utilises. .c'est mieux. ..
Commenter la réponse de jordane45
Whismeril 12118 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 20 août 2014 à 23:08
0
Merci
Et comme tu avais posté deux fois le message en VB6 et en VB.Net, dans quel langage?
Commenter la réponse de Whismeril
quentin22breizh - 21 août 2014 à 09:18
0
Merci
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")
Commenter la réponse de quentin22breizh
quentin22breizh - 21 août 2014 à 18:53
0
Merci
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
Whismeril 12118 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 21 août 2014 à 23:03
Tu peux mettre la discussion Résolue.
quentin22breizh 35 Messages postés mercredi 30 juillet 2014Date d'inscription 27 avril 2017 Dernière intervention - 22 août 2014 à 10:13
Peux tu m'expliquer comment faire stp? Je suis nouveau sur le forum.

Merci d'avance
Whismeril 12118 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 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
Commenter la réponse de quentin22breizh
Whismeril 12118 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 octobre 2018 Dernière intervention - 23 août 2014 à 20:03
0
Merci
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
Commenter la réponse de Whismeril

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.