Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XML/XSL et SOAP Discussion :

Insérer un commentaire dans un noeud


Sujet :

XML/XSL et SOAP

  1. #1
    Membre du Club
    Insérer un commentaire dans un noeud
    Bonjour à tous,
    Voilà, depuis quelques jours je me lance dans le xml à partir de vba et je dois dire que grâce aux nombreux tutos du site, j'ai compris et mis en oeuvre pas mal de choses.

    Je me tourne vers vous ce soir car je n'ai pas trouvé de solution pour incorporer un commentaire dans un noeud. Je sais le faire au niveau de la racine, mais tous mes essais pour le mettre dans un noeud se soldent par un échec. Ca doit être un truc tout simple qui m'échappe, mais je suis arrivé au bout de mes maigres connaissances en la matière.

    Ci-après un tout petit bout de mon code avec la déclaration des variables, la racine, un noeud et son commentaire (qui doit bien entendu apparaître sous la forme <!-- mon commentaire --> dans mon xml)

    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    'définition des variables
    Dim XMLDiffusion As MSXML2.DOMDocument
    Dim Node As MSXML2.IXMLDOMNode
    Dim Attribut As MSXML2.IXMLDOMNode
    Dim Commentaire As MSXML2.IXMLDOMComment
    Const NamespaceAttr As String = "xmlns<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />si"
    Const NamespaceVal As String = "http://www.w3.org/2001/XMLSchema-instance"
     
    'création du xml
    Set XMLDiffusion = New MSXML2.DOMDocument
     
    'Ajout des données d'encodage
    Set Node = XMLDiffusion.CreateProcessingInstruction("xml", "version=""1.0"" encoding=""utf-8""")
    XMLDiffusion.appendChild Node
     
    'création d'une racine
    With XMLDiffusion.appendChild(XMLDiffusion.createElement("donnees"))
        XMLDiffusion.DocumentElement.setAttribute NamespaceAttr, NamespaceVal
           With .appendChild(XMLDiffusion.createElement("commentaire"))
                 Set Commentaire = XMLDiffusion.createComment("Ceci est mon commentaire")
                'c'est là que je coince car je ne trouve pas l'instruction qui me permettrait d'enregistrer le createComment dans ce noeud
           End With
    End With

    Merci d'avance pour votre aide

  2. #2
    Membre émérite
    Si on veut l'y trouver sous un élément Commentaire, on fait comme ça.
    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With XMLDiffusion.appendChild(XMLDiffusion.createElement("donnees"))
        XMLDiffusion.DocumentElement.setAttribute NamespaceAttr, NamespaceVal
           With .appendChild(XMLDiffusion.createElement("commentaire"))
                 Set Commentaire = XMLDiffusion.createComment("Ceci est mon commentaire")
                .appendChild Commentaire
           End With
    End With

    Si on veut l'y trouver sous l'élément données, la racine, on fait comme ça.
    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With XMLDiffusion.appendChild(XMLDiffusion.createElement("donnees"))
        XMLDiffusion.DocumentElement.setAttribute NamespaceAttr, NamespaceVal
        Set Commentaire = XMLDiffusion.createComment("Ceci est mon commentaire")
        .appendChild Commentaire
    End With

  3. #3
    Membre du Club
    Merci beaucoup tsuji, c'était bien ça.



    Et j'ai enfin compris pourquoi je pensais que ça ne fonctionnait pas.

    Il s'agit en réalité d'un problème de contenu selon le type de sortie.
    En effet, j'avais bien essayé le ".appendChild Commentaire" après mon Set comme vous me l'avez écrit, mais je ne visualisais pas le résultat espéré.
    Et pour cause.
    Je crée 2 fichiers xml en fin de macro, un non indenté pour la diffusion et un autre indenté pour visualiser le contenu de manière plus lisible. De plus, je lance un TreeView dans un userform en fin de création des fichiers pour visualiser directement dans Excel l'arborescence et le contenu.

    Dans TreeView, j'utilise le fichier pour diffusion et il y a bien une indication d'un commentaire mais il apparait sous le libellé "8: #comment" et non avec son contenu.



    Mais c'est surtout sur le fichier indenté qu'il y a un problème puisque le commentaire n'apparait pas du tout !



    Comme je vérifiais mes sorties uniquement sur ce fichier, je ne pouvais pas voir les commentaires, d'où ma demande d'aide.

    Le code pour la création de ce fichier est le suivant :
    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Set rdr = CreateObject("MSXML2.SAXXMLReader")
    Set wrt = CreateObject("MSXML2.MXXMLWriter")
    Set XMLIndent = CreateObject("ADODB.STREAM")
    XMLIndent.Open
    XMLIndent.Charset = "utf-8"
     
    wrt.indent = True
    wrt.Encoding = "utf-8"
    wrt.output = XMLIndent
    Set rdr.contentHandler = wrt
    Set rdr.errorHandler = wrt
    rdr.Parse XMLDiffusion
    wrt.flush
     
    'Sauvegarde du fichier indenté
    Desti = Chemin & "\" & NomXML & " version indent.xml"
    XMLIndent.Savetofile Desti, 2


    Si ce n'est pas trop un problème sur TreeView qui n'est qu'informatif, la version indenté devrait quand à elle contenir les commentaires. Il y a t'il quelque chose qui manque dans le code ci-dessus qui empêcherait la prise en compte des commentaires ?

  4. #4
    Membre émérite
    Le manque le plus important de la configuration est qu'il faut avoir préciser un handler lexique qui est nécessaire pour gérer les commentaires. Et puis, il y a des lignes qui sont fausses, parfois graves et parfois mineures.

    Voici une réécriture avec minimum de corrections qui sont éssentielles d'après moi. Et, comme telle, elle est encore loin d'être satisfaisante à mon gré mais elle est capable tout de même de se faire tourner dans des circonstances limitées.
    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Set rdr = CreateObject("MSXML2.SAXXMLReader")
    Set wrt = CreateObject("MSXML2.MXXMLWriter")
    Set XMLIndent = CreateObject("ADODB.STREAM")
    XMLIndent.Open
    XMLIndent.Charset = "utf-8"
     
    wrt.indent = True
    wrt.Encoding = "utf-8"
     
    'préferrablement pour ne pas être gêné par un bogue d'apparence
    wrt.omitXMLDeclaration=true
     
    'C'est faux
    'wrt.output = XMLIndent
     
    Set rdr.contentHandler = wrt
    Set rdr.errorHandler = wrt
     
    'Il faut ajouter un handler lexique.
    rdr.putProperty "http://xml.org/sax/properties/lexical-handler", wrt
     
    rdr.Parse XMLDiffusion
     
    'Il faut ajouter le contenu au stream
    XMLIndent.writeText=wrt.output
     
    wrt.flush
     
    'Sauvegarde du fichier indenté
    Desti = Chemin & "\" & NomXML & " version indent.xml"
    XMLIndent.Savetofile Desti, 2

    Voilà !

  5. #5
    Membre du Club
    Alors là bravo tsuji et merci pour ce correctif. Les commentaires apparaissent bien maintenant.

    Pour info, le code que j'ai donné n'est pas de moi. Il a été récupéré sur une FAQ VBscript du site : https://vb.developpez.com/faq/vbs?pa...u-document-XML
    Je l'ai simplement retranscrit pour mon besoin. Je ne maitrise pas encore suffisamment les arcanes des fichiers xml pour être capable d'écrire un code comme ça, et encore moins de le déboguer.

    Concernant votre code, il fonctionne très bien. Je ne sais pas si c'est utile, j'y ai simplement rajouté un handler que j'ai trouvé sur le forum :
    Code VBA :Sélectionner tout -Visualiser dans une fenêtre à part
    rdr.putProperty "http://xml.org/sax/properties/declaration-handler", wrt


    Le xml indenté est OK, sauf que la déclaration en première ligne a disparu.
    J'en ai conclu que c'était wrt.omitXMLDeclaration = True qui bloquait. Je l'ai désactivé et maintenant elle est affichée, sauf que l'encodage indiqué est UTF-16 alors que l'encodage spécifié est UTF-8 (wrt.Encoding = "utf-8")
    Code xml :Sélectionner tout -Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-16" standalone="no"?>

    Est-ce ce que vous appelez le bogue d'apparence ?
    Le standalone me gène un peu aussi mais je crois comprendre qu'on ne peut pas y faire grand chose.