2017-10-19 12 views
-2

Ceci est l'extrait de mon code, cette partie est de lire le fichier XML et d'obtenir le dernier attribut enfant de Operations. Dans ce cas, je veux obtenir le type C. La chose est le script a sauté toute la boucle For, comme le prouve l'écho que j'ai mis. J'ai fait quelques recherches et je ne pouvais toujours pas savoir ce qui ne va pas avec mon code.VBScript ne peut pas itérer les noeuds XML

Set FSO = CreateObject("Scripting.FileSystemObject") 
Set xmlDoc = CreateObject("Microsoft.XMLDOM") 
xmlDoc.Async = "False" 
counter = 0 
xmlDoc.Load(mostrecent(i).Name) 

Set colNodes = xmlDoc.SelectNodes("/Runs/Run/Operations") 

WScript.Echo counter  '<--appears 
For Each objNode In colNodes 
    WScript.Echo counter '<--didn't appear 

    If Attr.Exists(objNode.LastChild.GetAttribute("type")) Then 
     counter = counter + 1 
     WScript.Echo counter 
    End If 
Next 

XML:

<Runs> 
<Run> 
    <Operations> 
    <Operation type="A"></Operation> 
    <Operation type="B"></Operation> 
    <Operation type="C"></Operation> 
    </Operations> 
</Run> 
</Runs> 
+0

Attr est un objet Dictionary, si la valeur d'attribut est l'une de la valeur dans le dictionnaire, contre + 1. – Zephyros

+1

Si vous ne voyez aucune sortie de la boucle, cela signifie que 'SelectNodes' ne renvoie aucun noeud. Cela se produit généralement lorsque les données XML ont des espaces de noms. Votre XML actuel contient-il des attributs 'xmlns = ...' et/ou des nœuds ''? –

+0

Non, mon XML commence et se termine par Zephyros

Répondre

1

Essayez ce morceau de code pour obtenir l'attribut type du dernier enfant du parent nœud Operations

Dim objXML, strPath, objCol 
strPath = mostrecent(i).Name 
Set objXML = CreateObject("Microsoft.XMLDOM") 
objXML.async=False 
objXML.load strPath 
strQuery = "/Runs/Run/Operations/Operation" 
Set objCol = objXML.selectNodes(strQuery)   'collection of all the <Operation> nodes 
MsgBox objCol.item(objCol.length-1).attributes.getnameditem("type").text 

Mise à jour: fonctionne bien pour moi :

enter image description here

+0

BTW Vous pouvez ajouter '' devant votre fragment de code pour corriger la coloration syntaxique. – Tomalak

+0

@Tomalak Merci pour la suggestion. Actualisé. – Gurman

+0

Objet requis: Erreur 'objCol.item (...)' – Zephyros

0

Si vous voulez simplement obtenir toutes les opérations avec le type = C, vous pouvez utiliser le code ci-dessous

Set objXML = CreateObject("MSXML2.DOMDocument.6.0") 
With objXML 
    .SetProperty "SelectionLanguage", "XPath" 
    .ValidateOnParse = True 
    .Async = False 
    .Load "C:\Users\Pankrit\Desktop\test.xml" 
End With 

Set nodesC = objXML.DocumentElement.SelectNodes("/Runs/Run/Operations/Operation[@type='C']") 
If nodesC.Length >= 1 Then 
    For Each nodeC In nodesC 
     MsgBox nodeC.NodeName 
    Next 
End If