[Calc] Recherche d'élément dans un XML

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur : Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.
jean-christophe
Membre hOOnoraire
Membre hOOnoraire
Messages : 101
Inscription : 12 févr. 2007 09:54
Localisation : Paris

[Calc] Recherche d'élément dans un XML

Message par jean-christophe »

Bonjour,

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)
Puis la fonction de recherche :

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
Ubuntu "EupTouDaite".
LibreOffice "EupTouDaite" aussi (4.2.3.3 en juin 2014)