IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut 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:xsi"
    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    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 confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut
    Merci beaucoup tsuji, c'était bien ça.

    Nom : Annotation 2020-03-25 123319.jpg
Affichages : 401
Taille : 22,4 Ko

    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.

    Nom : Annotation 2020-03-25 123320.jpg
Affichages : 444
Taille : 3,6 Ko

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

    Nom : Annotation 2020-03-25 123321.jpg
Affichages : 398
Taille : 4,8 Ko

    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 Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    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 confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Octobre 2012
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2012
    Messages : 78
    Par défaut
    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.

Discussions similaires

  1. [AC-2003] Insérer des commentaires dans ma table
    Par Etudiantetoulouse dans le forum Modélisation
    Réponses: 3
    Dernier message: 16/05/2013, 17h50
  2. [XL-2003] Insérer des commentaires dans une plage de cellules
    Par C Blaise dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 15/04/2011, 09h59
  3. [XL-2007] Insérer contenu cellule dans un commentaire
    Par Kermichou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/11/2010, 12h00
  4. Insérer commentaire dans un pdf
    Par Philippe42400 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/07/2009, 11h35
  5. Insérer nouveau attribut dans un noeud existant
    Par DiamonDonald dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 17/07/2008, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo