Boucle par le biais d'un document XML complet
Je suis à la recherche d'un moyen de faire une boucle par tous les nœuds de mon document XML.
Fichier XML de l'échantillon
<root>
<llnode created="2005-05-24T15:26:24" createdby="42912153" createdbyname="" description="" id="107810306" modified="2008-06-05T16:07:44" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810295" size="4">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
<llnode created="2005-05-06T12:54:03" createdby="42912153" createdbyname="" description="" id="107815681" modified="2006-12-04T14:39:51" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
</llnode>
<llnode created="2005-05-06T12:54:31" createdby="42912153" createdbyname="" description="" id="107815683" modified="2006-12-04T14:39:53" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
</llnode>
</llnode>
<llnode created="2005-05-24T15:26:24" createdby="42912153" createdbyname="" description="" id="107810306" modified="2008-06-05T16:07:44" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810295" size="4">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
<llnode created="2005-05-06T12:54:03" createdby="42912153" createdbyname="" description="" id="107815681" modified="2006-12-04T14:39:51" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
</llnode>
<llnode created="2005-05-06T12:54:31" createdby="42912153" createdbyname="" description="" id="107815683" modified="2006-12-04T14:39:53" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
</llnode>
</llnode>
</root>
Le document a toujours la même structure. Chaque llnode représente un dossier. Cela peut aller très profond (pour les fins de l'exemple ci-dessus, le champ d'application est seulement 2, mais il peut aller jusqu'à 10).
Comment puis-je faire une boucle par tous les records? Je ne veux pas mettre une boucle dans une boucle, puis une autre boucle et faire comme 20 fois pour être sûr de traiter chaque nœud. Est-il un moyen de faire une boucle de boucles?
Ci-dessous est ce que j'ai obtenu jusqu'à présent, seuls de travail pour le document XML (scope=2), il serait nécessaire d'ajouter autant de boucles que l'étendue augmente (il ne devrait pas aller au-dessus de la portée=10)
Original VBA (à partir de la question initiale)
xmlExportDoc = "myXmlDoc.xml"
Set xmlDoc = New MSXML2.DOMDocument
xmlDoc.Load (xmlExportDoc)
Set xmlNodeList = xmlDoc.SelectNodes("//llnode")
For Each Node In xmlNodeList
MsgBox "Listing the EXISTING nodes"
MsgBox Node.nodeName & " " & Node.NodeValue & " " & Node.NodeType
If Node.HasChildNodes() Then
MsgBox Node.nodeName & "has child nodes"
Set xmlNodeList2 = Node.ChildNodes
For Each Node2 In oNodeList2
MsgBox Node2.nodeName & " " & Node2.NodeValue & " " & Node2.NodeType
If Node2.HasChildNodes() Then
MsgBox Node2.nodeName & "has child nodes"
End If
Next
End If
Next
MIS À JOUR VBA
Private Function xmlParse(n As MSXML2.IXMLDOMNode)
Dim n2 As MSXML2.IXMLDOMNode
MsgBox n.nodeName & " " & n.NodeValue & " " & n.NodeType
If n.HasChildNodes() Then
MsgBox n.nodeName & " has child nodes"
For Each n2 In n.ChildNodes
xmlParse (n2)
Next
MsgBox "Done listing child nodes for " & n.nodeName
End If
End Function
Et le code de l'événement:
Dim xmlExportDoc As String
Dim xmlDoc As MSXML2.DOMDocument
Dim xmlNodeList As MSXML2.IXMLDOMNodeList, xmlNodeList2
Dim Node As MSXML2.IXMLDOMNode
xmlExportDoc = "http://myserver.com/myDoc.xml"
Set xmlDoc = New MSXML2.DOMDocument
xmlDoc.async = False
xmlDoc.Load (xmlExportDoc)
Set xmlNodeList = xmlDoc.SelectNodes("//llnode")
For Each Node In xmlNodeList
Call xmlParse(Node)
Next
Ce ne fonctionnent toujours pas, eu une erreur lors de la récursif xmlParse()
appel, car MSXML2.IXMLDOMNode.ChildNodes
ne semble pas être un MSXML2.IXMLDOMNode
type.
OriginalL'auteur dnLL | 2013-01-18
Vous devez vous connecter pour publier un commentaire.
Je pense que ce dont vous avez besoin ici est une fonction récursive. Je ne sais pas vraiment syntaxe VBA pardonne donc le pseudo-code, mais vous devriez être capable de faire quelque chose comme ceci:
Oui,
/*/llnode
sélectionne le niveau supérieurllnodes
.//llnode
sélectionne tous lesllnodes
dans le document à toutes les profondeurs dans un seul ensemble.Oups, je ne suis pas vraiment familial avec le XML, je suppose que /llnode et */llnode également produit des résultats différents. En fait, le <root> dans mon exemple ci-dessus est également un <llnode>.
J'obtiens une erreur d'automatisation de me dire que les données ne sont pas encore disponibles (en faisant de la
For Each node in xmlNodeList
).Êtes-vous de récupérer le fichier XML à partir d'internet? Il semble que peut-être le xmlDoc.La méthode Load() est asynchrone. Ce DONC, la question semble se référer à un problème similaire: lien
OriginalL'auteur JLRishe
Voici ce que je viens jusqu'ici:
Il fonctionne que si la hiérarchie n'est pas important, parce que ce script juste boucles à travers les nœuds quel que soit le niveau. Si la hiérarchie est importante, regardez JLRishe de réponse.
OriginalL'auteur dnLL