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

fanch55

XLDnaute Barbatruc
Salut le forum, @patricktoulon
Après m'être cassé les dents toute l'après-midi sur les escaped et autre xmlwriter sans succès (et en testant le supertip sur Office Ribbon Editor ),
je suis tombé sur ce site
dont j'ai pompé dans la première réponse tous les codes de Classe ( ce qui marche n'est pas à refaire ... )
et j'en suis donc arrivé à ce classeur qui semble donner une solution :
 

Pièces jointes

  • XmlPat.xlsm
    20.1 KB · Affichages: 2
Dernière édition:

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
 

fanch55

XLDnaute Barbatruc
Merci Patrick pour ces explications très claires .

Pour ceux qui pensent avoir trouvé un endroit où loger un mode d'emploi ,
le nombre de lignes du supertip est dépendant de l'écran (pas de la fenêtre)
1695236105411.png

et la longueur max limité à 1024 cars ( le "&#13;" compte déjà pour 5 cars ...)
[et de toute zone de texte par ailleurs en standard tel que décrit ci-dessous ]
1695238018176.png
 

fanch55

XLDnaute Barbatruc
Perso, je construis plutôt le supertip dans le code via le call back,
cela me permet un supertip approprié à un contexte, le retour à la ligne se faisant par un vblf:

VB:
Sub Get_Supertip(control As IRibbonControl, ByRef returnedVal)
Dim Rval As String, Line As String, I As Integer
    For I = 1 To 10: Line = Line & "----+----|": Next
    For I = 1 To 10
        If Rval = "" Then Rval = Line Else Rval = Rval & vbLf & Line
    Next
    If Len(Rval) > 1024 Then returnedVal = "Overflow, length=" & Len(Rval) Else returnedVal = Rval
End Sub
1695240652533.png
 

patricktoulon

XLDnaute Barbatruc
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
 

Statistiques des forums

Discussions
312 206
Messages
2 086 219
Membres
103 158
dernier inscrit
laufin