[xml - DOM] identer le code XML generé

Résolu
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 - 18 janv. 2006 à 18:16
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 - 19 janv. 2006 à 14:47
Bonjour a tous,

J'utilise (sous VB6) MSXML pour générer... un fichier XML
jusque la tout va bien, sauf que lorque j'ouvre mon fichier XML avec un editeur simple (genre notepad), il n'y a aucune indentation.

est ce que quelqu'un sait comment indenter le code XML generer.

voici un petit bout de mon code pour que vous compreniez ce que je fais :

Dim xRoot As MSXML2.IXMLDOMElement
Dim xTrialOrder As MSXML2.IXMLDOMElement
Dim xContact As MSXML2.IXMLDOMElement
Dim xDonnee As MSXML2.IXMLDOMElement


'********** Generation du fichier XML ***************
'insertion de l'entete
Set pi = objXML.createProcessingInstruction("xml", "version='1.0' encoding='ISO-8859-1'")
objXML.insertBefore pi, objXML.childNodes.Item(0)

'*** root
Set xRoot = objXML.createElement("Root")
objXML.appendChild xRoot
'*** TrialOrder
Set xTrialOrder = objXML.createElement("TrialOrder")
xRoot.appendChild xTrialOrder

'*** Contact
Set xContact = objXML.createElement("Contact")
xTrialOrder.appendChild xContact

'*** PartnerCode
Set xDonnee = objXML.createElement("PartnerCode")
xDonnee.Text = strPartnerCode
xContact.appendChild xDonnee

(...) 'la il y a encore une serie de balises...

objXML.save chemin

merci par avance a ceux qui pourront m'aider (et a ceux qui auront lu jusqu'ici aussi car c'est deja sympa :))

3 réponses

ZZEBULON Messages postés 17 Date d'inscription mardi 1 juillet 2003 Statut Membre Dernière intervention 23 février 2010
18 janv. 2006 à 21:05
Salut,

J'ai rencontré le même problème.
Je ne l'ai pas réglé, en tout cas, pas de manière élégante.
Le fait que le fichier xml ne soit pas indenté ne nuit pas au fonctionnement des appli qui l'utilise mais pour une visualisation, c'est galère.

Je me suis fait un outil. Un truc tout bête qui, une fois que le fichier xml existe, l'ouvre en tant que Textstream et remplace les "<Root>" par "<Root>" & vbCrlf, les "<TrialOrder>" par Space(35) & "<TrialOrder>" & vbCrlf, etc...
mais ça reste du bricolage.

Si on pouvait générer directement cette indentation, ça serait plus classieux!
3
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
19 janv. 2006 à 14:47
salut

d'abord merci pour vos réponses.

169075 CanisLupus, j'avais deja regardé la source que tu as mis en reference, je m'en suis meme servi car je n'avais jamais généré de XML sous VB. mais elle presente le meme probleme : il n'y a aucune indentation dans le ficheir généré. quand on l'ouvre sous IE, ca parait indenté, mais sous notepad, on se rend compte que ca ne l'est pas.

quant à la solution de ZZEBULON, c'est justement la reponse que je craignais. :)


J'esperait qu'il y ait une methode avec DOM pour indenté, mais je penseque ca n'est pas le cas, et c'est pourquoi je n'ai pas trouvé de solution directe sur le net.


maisj'ai quand meme trouvé une solution alternative qui se base sur ce principe. il s'agit d'une fonction qui indente le code XML :


pour l'utilser, avant de faire le fameux objXML.save(), il faut faire
objXML.loadXML FormatXML(objXML, 0)
ou FormatXML est la fameuse fonction ci dessous.

j'espere que cela pourra servir a d'autres...

'************************************************************
Private Function FormatXML(ptrNode As MSXML2.IXMLDOMNode, Optional iTabLevel As Integer = 0) As String
Rem cette fonction (trouvée sur le net) permet d'indenter le code XML
Dim bMixedTextNode As Boolean
Dim bHasOnlyATextNode As Boolean
Dim i As Integer


With ptrNode
Select Case .nodeType
Case NODE_DOCUMENT, NODE_DOCUMENT_FRAGMENT
'all child nodes of the document should be at the same indent Level
'just iterate over them and recurse with 0 indent
For i = 0 To .childNodes.length - 1
FormatXML = FormatXML & FormatXML(.childNodes(i))
Next i

Case NODE_TEXT
'should render the same way the default IE5 stylesheet does for mixed content
'figure out if we're in some mixed content


'if this text node has any siblings it's in mixed content
bMixedTextNode = (.parentNode.childNodes.length > 1)

'if mixed indent this string
If bMixedTextNode Then FormatXML = String(iTabLevel, vbTab)


'we're gonna strip out any tabs and carriage returns from the Text
FormatXML = FormatXML & Trim(Replace(Replace(.xml, vbCrLf, " "), vbTab, " "))


'if mixed add cariage return
If bMixedTextNode Then FormatXML = FormatXML & vbCrLf


Case NODE_ELEMENT
If .hasChildNodes Then
'if the node has only one child and
'that child is text we won't add carriage return after opening tag bHasOnlyATextNode (.childNodes(0).nodeType NODE_TEXT) And (.childNodes.length = 1)
End If

'open the start tag
FormatXML = String(iTabLevel, vbTab) & "<" & .nodeName


'recurse over the attributes
For i = 0 To .Attributes.length - 1
FormatXML = FormatXML + FormatXML(.Attributes(i))
Next i


'properly close the start tag based on node's contents
If Not .hasChildNodes Then 'no child nodes so it's an empty element
FormatXML = FormatXML & "/>" & vbCrLf

Else
If bHasOnlyATextNode Then 'has only text for children - don't add carriage return
FormatXML = FormatXML & ">"
Else 'has child elements - add carriage return
FormatXML = FormatXML & ">" & vbCrLf
End If

'recurse if there's children
For i = 0 To .childNodes.length - 1
FormatXML = FormatXML & FormatXML(.childNodes(i), iTabLevel + 1)
Next i

'properly indent and add the end tag
If Not bHasOnlyATextNode Then FormatXML = FormatXML & String(iTabLevel, vbTab)
FormatXML = FormatXML & "</" & .nodeName & ">" & vbCrLf

End If

Case NODE_COMMENT, NODE_CDATA_SECTION
'if comment is on more than one line don't indent If InStr(1, .xml, vbCr) 0 Then FormatXML String(iTabLevel, vbTab)
FormatXML = FormatXML & .xml & vbCrLf

Case NODE_ATTRIBUTE
'if there are double quotes in the attribute use single quotes to surrond the attr value
If InStr(1, .Text, Chr(34)) > 0 Then
FormatXML = " " & .nodeName & "='" & .Text & "'"
Else
FormatXML = " " & .nodeName & "=" & Chr(34) & .Text & Chr(34)
End If

Case NODE_ENTITY
'and we would never want entites expanded

Case Else
'all other node types should just return their xml (properly indented)
'these include - entity refs, pi's, notations, doctypes
FormatXML = String(iTabLevel, vbTab) & .xml & vbCrLf

End Select

End With


End Function
'************************************************************
3
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 20
18 janv. 2006 à 22:28
Salut,

Peut-être que cette source pourra t'aider ?


http://www.vbfrance.com/code.aspx?ID=27570

-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
0
Rejoignez-nous