Looping through XML file elements

17,801

Solution 1

You can use the .ChildNodes Property

Dim xmlDoc, objNodeList, plot
dim fileNodes
dim comNodeItem
dim fileNodeItem
dim fileName, jobName

Set xmlDoc = CreateObject("Msxml2.DOMDocument")

xmlDoc.setProperty "SelectionLanguage", "XPath"
xmlDoc.load("C:\test\combineXML.xml")

WScript.Echo xmlDoc.parseError

Set objNodeList = xmlDoc.getElementsByTagName("com")

For each comNodeItem in objNodeList
    JobName = comNodeItem.getAttribute("name")
    for each fileNodeItem in comNodeItem.ChildNodes
        fileName = fileNodeItem.getAttribute("name")
        WScript.Echo JobName & ": " & fileName
    next
Next

This will work if the file is as simple as your example. If you want only file nodes to be processed, and others ignored, you can also just use again:

    for each fileNodeItem in comNodeItem.getElementsByTagName("file")

Solution 2

You're making this too complicated. Just select the name attribute from the child nodes of all com nodes with an XPath expression:

Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.async = False
xmlDoc.load "C:\test\combineXML.xml"
If xmlDoc.parseError = 0 Then
  For Each x In xmlDoc.selectNodes("//com/*/@name")
    WScript.Echo x.text
  Next
End If

Use //com/file/@name if you need the expression to be more specific (in case there are other child nodes with a name attribute.

If you also want attributes from a parent node, you'll have to modify it like this:

Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.async = False
xmlDoc.load "C:\test\combineXML.xml"
If xmlDoc.parseError = 0 Then
  For Each x In xmlDoc.selectNodes("//com/*")
    WScript.Echo x.parentNode.getAttribute("name") & ": " _
      & x.getAttribute("name")
  Next
End If
Share:
17,801
user505210
Author by

user505210

Updated on June 28, 2022

Comments

  • user505210
    user505210 almost 2 years

    I have a XML file below. I want to loop through this file and extract the node node value, like for node <com> get the name value and then loop 2 times to get the file values. I can currently get the value for the node <com> but am unsure how to loop inside and get the values for file node.

    <common>
      <com name="Test1.css">
        <file name="Tech.css"/>
        <file name="Comp.css"/> 
      </com>
      <com name="Test2.css">
        <file name="HR.css"/>
        <file name="HR2.css"/> 
      </com> 
    </common>
    
    Dim xmlDoc, objNodeList, plot
    Set xmlDoc = CreateObject("Msxml2.DOMDocument")
    xmlDoc.setProperty "SelectionLanguage", "XPath"
    xmlDoc.load("C:\test\combineXML.xml")
    WScript.Echo xmlDoc.parseError
    Set objNodeList = xmlDoc.getElementsByTagName("com")
    If objNodeList.length > 0 then
        For each x in objNodeList
            JobName = x.getattribute("name")
            WScript.Echo JobName
        Next
    End If