循环遍历XML文件元素

时间:2013-07-05 06:57:08

标签: xml vbscript

我在下面有一个XML文件。我想循环遍历此文件并提取节点节点值,如节点<com>获取名称值,然后循环2次以获取文件值。我当前可以获取节点<com>的值,但不确定如何在内部循环并获取文件节点的值。

<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

2 个答案:

答案 0 :(得分:5)

你这太复杂了。只需使用XPath表达式从所有name节点的子节点中选择com属性:

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

如果您需要更具体的表达式,请使用//com/file/@name(如果有其他子节点具有name属性。

如果您还需要来自父节点的属性,则必须按如下方式进行修改:

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

答案 1 :(得分:4)

您可以使用.ChildNodes属性

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

如果文件与示例一样简单,这将有效。如果您只想处理file个节点,而忽略其他节点,您也可以再次使用:

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