2010-11-16 3 views
0

je construis une liste de nœuds que je dois charger du document XML à l'aide SelectNodes (XPath):Interrogation doc XML avec Excel VBA

Set oNodeList = xmldoc.selectNodes("//Object/Property[@Name='Group' and Value='True']") 

et boucle à travers les nœuds:

For Each curNode In oNodeList 
    Set nAttr = curNode.parentNode.Attributes 
    If (nAttr.getNamedItem("Seq").nodeValue = "abc") Then 
' additional processing 
    End If 
Next 

Un traitement supplémentaire implique la boucle à travers les nœuds enfants de curNode. Je me demandais s'il était possible de construire encore une autre nodeList en utilisant selectNodes qui sélectionnerait des nœuds enfants de curNode répondant à des critères particuliers. Le point clé que xpath devrait commencer à chercher depuis le nœud actuel.

Comment puis-je faire cela?

+0

La documentation n'est pas claire. De http://msdn.microsoft.com/en-us/library/aa220790(v=office.11).aspx il semble que vous pouvez appeler la méthode 'selectNodes' uniquement pour une classe' Document', mais dans http: //msdn.microsoft.com/en-us/library/aa212478(v=office.11).aspx Il existe une méthode 'selectNodes' répertoriée liée à la même page de documentation. Donc, il n'est pas possible de dire comment 'selectNodes' définit le nœud de contexte. Vous pouvez essayer d'appeler cette méthode à partir de 'curNode'. En outre, vous effectuez un filtrage dans 'For Each' qui semble pouvoir être fait dans la première expression XPath. Clarifiez cela. –

+0

@Alejandro: Filtrage dans le Pour Chaque est ce que je fais maintenant et bien sûr cela fonctionne mais le code est moche. Ce serait beaucoup mieux si je pouvais Xpath à partir du nœud actuel. Je sais que je pourrais le faire en ajoutant [position() = nnn] à la requête d'origine (où nnn est index curNode) mais encore une fois, c'est moche. Je cherche xpath à partir du nœud actuel! – mtelis

Répondre

1

Alejandro, merci! Il semble que

curNode.Selectnodes("child::*") 

fait l'affaire!

+0

Je suis content que cela vous aide. Notez que '*' est une forme courte de 'child :: *' –