[VBA] fusion de 2 fichier XML ?
Résolu
mortelrdv
-
mortelrdv -
mortelrdv -
Bonjour,
j'utilise Excel 2003 SP2 sous winXP, et dans le VBA j'utilise la référence "Microsoft XML 3.0"
je cherche à fusionner 2 fichiers XML. Prenons par exemple ces 2 fichiers ci-dessous :
essai1.xml
essai2.xml
Le résultat serait, si on prend essai1.xml comme référence
image avec couleur c'est peut etre plus parlant
https://www.casimages.com/i/101019071102115823.jpg.html
http://www.zimage.biz/photo.php?id=63966
Merci de vos aides
PS: en vrai, vous vous endoutez que essai1.xml et essai2.xml est plus grand avec plus de nodes et de sous-nodes et de sous-sous-nodes et de sou.....
j'utilise Excel 2003 SP2 sous winXP, et dans le VBA j'utilise la référence "Microsoft XML 3.0"
je cherche à fusionner 2 fichiers XML. Prenons par exemple ces 2 fichiers ci-dessous :
essai1.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<personnes>
<personne age="49">
<prenom>Georges</prenom>
<etat>Marié</etat>
<enfants>
<enfant>
<nom>Tiop</nom>
</enfant>
</enfants>
</personne>
<personne age="88">
<nom>Godoh</nom>
<prenom>Madeleine</prenom>
<etat>Veuve</etat>
<enfants>
<enfant id="top">
<nom>Godoh</nom>
<prenom>Jean-Marie</prenom>
</enfant>
<enfant id="titi">
<prenom>Etienne</prenom>
</enfant>
</enfants>
</personne>
</personnes>
essai2.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<personnes>
<personne age="49">
<nom>Baud</nom>
<etat>Marié</etat>
<enfants>
<enfant>
<prenom>Elisabeth</prenom>
</enfant>
</enfants>
</personne>
<personne age="88">
<nom>Godoh</nom>
<prenom>Madeleine</prenom>
<etat>Veuve</etat>
<enfants>
<enfant id="top">
<nom>Godoh</nom>
</enfant>
<enfant id="titi">
<nom>Godoh</nom>
<prenom>Etienne</prenom>
</enfant>
</enfants>
</personne>
</personnes>
Le résultat serait, si on prend essai1.xml comme référence
<?xml version="1.0" encoding="ISO-8859-1"?>
<personnes>
<personne age="49">
<nom>Baud</nom>
<prenom>Georges</prenom>
<etat>Marié</etat>
<enfants>
<enfant>
<nom>Tiop</nom>
<prenom>Elisabeth</prenom>
</enfant>
</enfants>
</personne>
<personne age="88">
<nom>Godoh</nom>
<prenom>Madeleine</prenom>
<etat>Veuve</etat>
<enfants>
<enfant id="top">
<nom>Godoh</nom>
<prenom>Jean-Marie</prenom>
</enfant>
<enfant id="titi">
<nom>Godoh</nom>
<prenom>Etienne</prenom>
</enfant>
</enfants>
</personne>
image avec couleur c'est peut etre plus parlant
https://www.casimages.com/i/101019071102115823.jpg.html
http://www.zimage.biz/photo.php?id=63966
Merci de vos aides
PS: en vrai, vous vous endoutez que essai1.xml et essai2.xml est plus grand avec plus de nodes et de sous-nodes et de sous-sous-nodes et de sou.....
A voir également:
- [VBA] fusion de 2 fichier XML ?
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
1 réponse
Bon j'ai réussi à faire ce que je voulais, pour mon cas. C'est surement pas très optimal, mais bon je le mets.
Function test()
Dim xmlDocA As New DOMDocument60
Dim xmlDocB As New DOMDocument60
xmlDocA.async = False
xmlDocA.Load "c:\xmlbooks1.xml"
xmlDocB.async = False
xmlDocB.Load "c:\xmlbooks2.xml"
recursif xmlDocA.DocumentElement, xmlDocB.DocumentElement, 1
xmlDocA.Save "c:\result.xml"
Set xmlDocA = Nothing
Set xmlDocB = Nothing
End Function
Function recursif(ByRef parentElementA As IXMLDOMElement, ByRef parentElementB As IXMLDOMElement, ByVal Level As Integer)
Dim indexaA As Integer
Dim indexaB As Integer
For IndexA = 0 To parentElementA.ChildNodes.Length - 1
IndexB = 0
Do While IndexB <= (parentElementB.ChildNodes.Length - 1)
If parentElementA.ChildNodes(IndexA).NodeType = NODE_TEXT Or _
parentElementB.ChildNodes(IndexB).NodeType = NODE_TEXT Then Exit Function
If extractNodeAttributes(parentElementA.ChildNodes(IndexA).XML) = _
extractNodeAttributes(parentElementB.ChildNodes(IndexB).XML) Then
recursif parentElementA.ChildNodes(IndexA), parentElementB.ChildNodes(IndexB), Level + 1
parentElementB.RemoveChild parentElementB.ChildNodes(IndexB)
'IndexB = 0
Else
IndexB = IndexB + 1
End If
Loop
Next IndexA
For IndexA = 0 To parentElementB.ChildNodes.Length - 1
parentElementA.appendChild parentElementB.ChildNodes(IndexA)
Next IndexA
End Function
Function extractNodeAttributes(ByVal xmlString As String) As String
Dim iEnd As Integer
iEnd = InStr(1, xmlString, ">", vbTextCompare)
extractNodeAttributes = Mid(xmlString, 2, iEnd - 2)
End Function