XL 2013 petit problème de caractère a la création du xml

patricktoulon

XLDnaute Barbatruc
bonjour à tous
j'ai un petit soucis que je n'arrive pas a résoudre
a la création du xml (encodé en utf-8/utf-16) le caractère "&" se transforme en "&"
donc la chaine 
 se transforme en 

quelqu'un aurait une idée ?(pour garder "
")
VB:
Sub test()
Dim DocXml, balise, enfant, oCreation
Set DocXml = CreateObject("Microsoft.XMLDOM")    'creation
    Set balise = DocXml.appendchild(DocXml.createelement("balise"))
     balise.setAttribute "groupage", "do not"
    balise.setAttribute ("id"), "provix1"
    Set oCreation = DocXml.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""")    'creation de l'entete du process
    DocXml.InsertBefore oCreation, DocXml.ChildNodes.Item(0)    'insertion parametre process


    Set enfant = DocXml.createelement("enfant"): enfant.setAttribute "commentaire", "juste un test 
 de commentaire": enfant.setAttribute ("id"), "provix2"

    balise.appendchild (enfant)
SaveFormatDocToFileXL DocXml, ThisWorkbook.Path & "\exoamp.xml"
End Sub
'enregistrer le xml  au format utf-8 et indenté
Public Sub SaveFormatDocToFileXL(ByVal doc, ByVal FileName As String)
    Dim rdrdom As Object, StreamFormaté As Object, wtrFormatted As Object

    Set rdrdom = CreateObject("MSXML2.SAXXMLReader.6.0")
    Set StreamFormaté = CreateObject("ADODB.Stream")
    Set wtrFormatted = CreateObject("MSXML2.MXXMLWriter")

    With StreamFormaté
        .Open
        .Type = 1    'adTypeBinary
        With wtrFormatted
            .omitXMLDeclaration = False
            .standalone = True
            .byteOrderMark = True    'If not set (even to False) then
            '.encoding is ignored.
            .Encoding = "UTF-8"    'Even if .byteOrderMark = True
            'UTF-8 never gets a BOM.
            .indent = True
            .output = StreamFormaté
            With rdrdom
                Set .contentHandler = wtrFormatted
                Set .dtdHandler = wtrFormatted
                Set .errorHandler = wtrFormatted
                .putProperty "http://xml.org/sax/properties/lexical-handler", wtrFormatted
                .putProperty "http://xml.org/sax/properties/declaration-handler", wtrFormatted
                .Parse doc
            End With
        End With
        If Dir(FileName) <> "" Then Kill FileName
    
        .SaveToFile FileName
        .Close
    End With
    Set rdrdom = Nothing
    Set StreamFormaté = Nothing
    Set wtrFormatted = Nothing
End Sub

je me casse la tête depuis hier avec ça 🤣🤣
 
Solution
alors en ecriture ca va impec par contre en relecture l'orsque je réouvrait le projet
le "&#13;" ressortait comme des saut de ligne donc à la re sauvegarde je perdait tout repère
car les saut de ligne dans le customui c'est chr(32)+ un caractère inconnu+chr(10) donc pour le reconvertir c’était compliqué
donc je met en creation un"|" a la place des sauts de ligne je sauve avec l'ancienne fonction le projet
et quand je crée le fichier excel avec le customUI.xml final je le crée avec la fonction précédemment citée
terminé plus de problème de conversion

patricktoulon

XLDnaute Barbatruc
re
et ne vous cassez pas la tête va
j'ai trouvé
en fait c'est tout con de chez con
mon xml est construit avec lle post processing encoding utf-8

ensuite
dans l'object xmlwriter et le xmlreader je mettait déjà le charset en utf-8
donc "&#13;" se transforme déjà en "&amp;#13;"

sauf que par la suite l'object adobstream je lui met aussi le charset en utf-8 du coup il me reconverti le & encore une fois
conclusion
dans l'object xml writer qui me sert à parser le code je ne le formate pas en utf-f mais "iso-8859-1"
il me met les amp quand même muis que mon xml est en utf-8

mais je fait un replace des "amp" du output et je l'injecte dans l'object adobstream
et voila le tour est joué
voila maintenant mon customui j'ai la possibilité de mettre des sautS de ligne dans le supertip

VB:
Sub test2()
Dim DocXml, balise, enfant, oCreation
Set DocXml = CreateObject("Microsoft.XMLDOM")    'creation
    Set balise = DocXml.appendchild(DocXml.createelement("balise"))
   ' balise.setAttribute "azerty", "http://schemas.microsoft.com/office/2009/07/customui"
    balise.setAttribute "groupage", "do not"
    balise.setAttribute ("id"), "provix1"
    Set oCreation = DocXml.createProcessingInstruction("xml", "version=""1.0""  encoding=""UTF-8"" standalone=""yes""")    'creation de l'entete du process
    DocXml.InsertBefore oCreation, DocXml.ChildNodes.Item(0)    'insertion parametre process


    Set enfant = DocXml.createelement("enfant"): enfant.setAttribute "commentaire", "juste un test &#13; de commentaire": enfant.setAttribute ("id"), "provix2"

    balise.appendchild (enfant)
fichier = ThisWorkbook.Path & "\exo.xml"
IndenterXMLCode2 DocXml, ThisWorkbook.Path & "\exoamp2.xml"
End Sub
'version 2 en memoire
'attention enleve l'instruction de pressing
Public Function IndenterXMLCode2(ByVal vDomOrString As Variant, fichier$) As String
    Dim XMLWriter As Object    ' MSXML2.MXXMLWriter

    'On Error GoTo QH
    Set XMLWriter = CreateObject("MSXML2.MXXMLWriter")
     XMLWriter.omitXMLDeclaration = True    'supprime la declaration processing
   XMLWriter.indent = True    'ajoute l'attribut indent
    'XMLWriter.byteOrderMark = False
    XMLWriter.Encoding = "ISO-8859-1"    'encoding process ne fonctionne pas
    'alors on la supprime
    With CreateObject("MSXML2.SAXXMLReader")
        Set .contentHandler = XMLWriter
        '--- keep CDATA elements
        '.putProperty "http://xml.org/sax/properties/lexical-handler", XMLWriter
        '.putProperty "http://xml.org/sax/properties/declaration-handler", XMLWriter    'ne fonctionne pas non plus
        .Parse vDomOrString
    End With
    '--- success
     tt = Replace(XMLWriter.output, "&amp;#13;", "&#13;")
    Set Adobstream = CreateObject("ADODB.Stream")
    
     'Adobstream.Charset = "utf-8"
    Adobstream.Mode = adModeReadWrite
    Adobstream.Type = 2
    Adobstream.Charset = "UTF-8"
    Adobstream.Open
    Adobstream.WriteText tt
    Adobstream.SaveToFile fichier, 2

    'essaie de faire un replace mais fonctionne pas ca supprime carrément l'instruction encoding dans l'entete
    'IndenterXMLCode = Replace(XMLWriter.output, "UTF-16", "UTF-8")
    Exit Function
QH:
End Function
 

patricktoulon

XLDnaute Barbatruc
bonjour robert
j'ai déjà un module similaire
c'est pas le probléme de conversion
le problème c'est que l'application qui le lit ensuite n'interprète pas &#13; mais bien &amp;#13;
c'est pour le customUI en fait pour les commentaire dans superTip
j'essaie en ce moment de changer l'utf-8 pour le iso-8x....
visiblement si l'entête de processing correspond le customui est fonctionnel
 

RyuAutodidacte

XLDnaute Impliqué
Supporter XLD
C'est une supposition, mais lors de la conversion de ton xml en utf8, cela convertit tes
"&" en"&amp; , donc si tu as moyen de les échapper le "&", la conversion te mettrai & et non &amp;
Pour la quasi des language qd on échappe on met une barre oblique inversé, ce qui donnerai :
\& … et là le & serait protégé lors de la conversion en utf8

EDIT : autre ex. : sur le terminal pour les lignes de commandes (je suppose que c'est similaire sur windows),
lorsque l'on écrit un chemin contenant des espaces on met des quote en début et en fin :
'monChemin…' ce qui évite les pb et d'effectuer la ligne de commande correctement car les espaces sont compris réellement comme des espaces
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
AHHHHH...
mais non cette méthode d'échappement ne peut fonctionner en XML
demo.gif
 

Statistiques des forums

Discussions
312 368
Messages
2 087 653
Membres
103 630
dernier inscrit
Azashoriu