我在下面有一个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
答案 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")