• Initiateur de la discussion Initiateur de la discussion chrixsl
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

chrixsl

XLDnaute Nouveau
slt world,

soit le xml suivant à générer en vba:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<File att1="http://" att2="1.5" att3="fichier.txt" att4="2014-04-29" att5="" att6=".xls">
	<metadata att1="MAC" att2="0" att3="portable/tour" att4="5" att5="23">
		<nomOrder att1="or" att2="il" />
		<routage>
			<secretfait att1="08" att2="mc" att3="50" att3="1" att4="0"/>
			<nom att="0" att2="0" att3="0">
				<cle att1="0" att2="None" att3="0"><acle att1=" " att2="Interdit" att3=""/></cle>
				
                
			</nom>
		</routage>
		<Mod att1="0" att2="0" att3="bb" att4="ff"/>
	</metadata>
</File>

avec le code vba suivant
Code:
Private Sub Form_Load()
    Dim dom, node, attr, root

    On Error GoTo ErrorHandler

    Set dom = CreateDOM

    ' creation du preprocesseur.
    Set node = dom.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
    dom.appendChild node
    Set node = Nothing

    Set root = dom.createElement("File")
    ' création de l'émément racine et attributions des attributs
    
    Set attr = dom.createAttribute("att1")
    attr.Value = "http://"
    root.setAttributeNode attr
    Set attr = Nothing
    
    
     Set attr = dom.createAttribute("att2")
    attr.Value = "1.5"
    root.setAttributeNode attr
    Set attr = Nothing
    
     Set attr = dom.createAttribute("att3")
    attr.Value = "fichier.txt"
    root.setAttributeNode attr
    Set attr = Nothing
    
    
    Set attr = dom.createAttribute("att4")
    attr.Value = "2014-04-29"
    root.setAttributeNode attr
    Set attr = Nothing
    
    
    Set attr = dom.createAttribute("att5")
    attr.Value = ""
    root.setAttributeNode attr
    Set attr = Nothing
    
    
    Set attr = dom.createAttribute("att6")
    attr.Value = ".xsl"
    root.setAttributeNode attr
    Set attr = Nothing
    
    ' ajout d'un element et de ces sous elements.
    Set node = dom.createElement("metadata")
Set frag = dom.createDocumentFragment
        ' Add a newline + tab + tab.
    frag.appendChild dom.createTextNode(vbNewLine + vbTab + vbTab)
    frag.appendChild dom.createElement("nomOrder")
    ' Set attr = frag.appendChild.createAttribute("routage")
   ' attr.Value = ""
    'frag.setAttributeNode attr
    Set attr = Nothing
    
    root.appendChild node
       ' saut de ligne
    root.appendChild dom.createTextNode(vbNewLine)
    Set node = Nothing

    
    
    
  

    ' Savegarde du document xml sur le hdd.
    dom.Save ("c:\temp\dynamDom.xml")
    Set root = Nothing
    Set dom = Nothing
    Exit Sub

ErrorHandler:
    MsgBox Err.Description
End Sub

je ne vois pas pourquoi il est impossible de créer l'élément metadata et de lui attribuer des attributs
si quelqu'un peut m'expliquer ou se trouve mon erreur je lui serai très reconnaissant
 
Re : vba et xml

Bonjour,

Il te faut un XmlWriter pour cela. Ci dessous une macro qui te permet d'enregistrer ton document xml.

Supprime de ta macro les lignes
Code:
 ' creation du preprocesseur.
    Set node = dom.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
    dom.appendChild node
    Set node = Nothing

Et A la place de
Code:
dom.Save ("c:\temp\dynamDom.xml")

appelle la macro ci-dessous par XmlSave "c:\temp\dynamDom.xml", dom

où dom est une variable objet XmlDomDocument

Regarde quelle version XmlDomDocument tu crées, éventuellement change la version du paramètre xDoc

Tu peux également changer le charset ISO-8859-1 par UTF-8
Code:
Sub XmlSave(FullFileName As String, xDoc As MSXML2.DOMDocument60)
Dim rdr As New MSXML2.SAXXMLReader, wrt As New MSXML2.MXXMLWriter
Dim ostream As Object: Set ostream = CreateObject("ADODB.STREAM")    'createobject pour ne pas référencer msAdodb
    ostream.Open
    ostream.Charset = "ISO-8859-1"
    wrt.indent = True
    wrt.Encoding = "ISO-8859-1"
    wrt.output = ostream
    Set rdr.contentHandler = wrt
    Set rdr.ErrorHandler = wrt
    rdr.Parse xDoc
    wrt.flush
    ostream.SaveToFile FullFileName, 2
    Set rdr = Nothing
    Set wrt = Nothing
End Sub

A+
 
Dernière modification par un modérateur:
Re : vba et xml

salut hasco,
merci pour ton aide, mais on est bien d'accord ce code doit écrire les lignes du fichier xml, et me sortir un fichier xml comme montré dans le message.
car la je ne comprend rien du tout si tu peux m'expliquer stp
 
Re : vba et xml

Re,

mais on est bien d'accord ce code doit écrire les lignes du fichier xml

As-tu seulement essayer? Il n'y a pas grand chose a expliquer. Pour écrire un nouveau document xml sur disque il te faut un XmlWriter qui se traite comme dans la macro donnée dans mon post précédent.

La méthode save (dom.Save) ne peut écrire que l'entête par défaut d'un domDocument.

Si tu as du mal pour la mise en place, joint un fichier exemple avec tes macros et des données anonymisées.

A+
 
Re : vba et xml

j'ai suivi tes instructions
mais au moment de l’exécution j'ai paramètre incorrect.
et je pense qu'il bloque sur :XmlSave "c:\temp\dynamDom.xml", dom
et en déclarant dom as DOMDocument60 dans mon sub c'est là qu'est mon pb
 
Re : vba et xml

Re,

Sans fichier joint, je m'arrêterai là. Il faut connaitre la version du domDocument créé par ta macro CreateDOM. As-tu cocher les référence à Microsoft XML, V?
Où ? est un numéro de version.

Il y a des versions pour lesquelles createProcessingInstruction bug.
De plus la méthode .Save n'indente pas le fichier xml résultant.

A+
 
Dernière modification par un modérateur:
Re : vba et xml

Re,

voici ton fichier modifié. Le xml pondu reproduit exactement l'arborescence donnée en post#1

Tu peux en fin de macro choisir l'une ou l'autre des méthodes d'écriture sur disque en commentant l'une et décommentant l'autre:
1- dom.Save ("c:\temp\dynamDom.xml") n'indentera pas ton fichier qui sera écrit sur une seule ligne et on ne peut rien y faire (100% certain)

2-XmlSave "c:\temp\dynamDom.xml", dom indentera ton fichier mais rajoutera l'attribut "Standalone" dans les processing instructions et on ne peut rien y faire a priori, peut-être à postériori mais cela en vaut-il la peine, sachant que cet attribut indique si le fichier est dépendant "yes" ou non "no" d'une DTD.

A+

P.S. pourquoi mettre les lignes dans un Form_Load ? Tu as récupérer ça sur internet? Non?
 
Dernière modification par un modérateur:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour