Je vous présente la macro résultant d'un problème que j'ai eu.
Le problème est simple : dans une arborescence de nœuds XML, je cherche un nœud en fonction d'un texte.
La solution a été vraiment casse-tête, mais j'ai pu trouver un truc à base de fonction récursive sur :
http://www.developpez.net/forums/d13478 ... recherche/
Voici la macro :
Code : Tout sélectionner
' appel dans la fonction
oLinks = oXMLDOM.getElementsByTagName("Service")
If (oLinks.Length > 0) Then
' parcourir les services déjà existant
For k = 0 to (oLinks.Length - 1)
' recherche récursive dans le noeud
oTmpNode = oLinks.item(k)
oResNode = BoucleElements(oTmpNode, "Service 32")
If ( (Not isNull(oResNode)) AND (isObject(oResNode)) ) Then
' le noeud du service a été trouvé
flag_trouve = true
' se placer sur le noeud pour créer un nouveau
oXMLDOM_PathNode = oResNode
Exit For
End If
Next k
End If '(oLinks.Length > 0)
Code : Tout sélectionner
' *******************************************
' fonction récursive de recherche de noeuds
' *******************************************
Function BoucleElements(oElem As object, pattern As String) as Variant
Dim oNdListe As object
flag_continue = true
Select Case oElem.nodeType
Case NODE_TEXT 'type texte #text
TmpStr = oElem.nodeValue
If (TmpStr = pattern) Then
flag_continue = false
oReturn = oElem.ParentNode ' c'est un noeud de type #text, récupérer le parent
End If
End Select
' si le noeud n'est pas dans ce niveau alors lancer la recherche dans le niveau inférieur
If (flag_continue = true) Then
Set oNdListe = oElem.childNodes 'boucle récursive pour les noeuds enfants
For i = 0 To ( oNdListe.Length - 1 )
TmpO = BoucleElements( oNdListe.Item(i), pattern )
' remonter l'objet
If ( (Not isNull(TmpO)) AND (isObject(TmpO)) ) Then
oReturn = TmpO
Exit for
End If
Next i
End If
If ( not (isobject(oReturn)) ) Then
oReturn = ""
End If
BoucleElements = oReturn
End Function