我有以下XML:
adapt.xml:
<Adapters>
<Adapter>
<IPAddresses>
<IPAddress>1.1.1.1</IPAddress>
<IPAddress>2.2.2.2</IPAddress>
<IPAddress>3.3.3.3</IPAddress>
</IPAddresses>
<IPSubnets>
<IPSubnet>255.0.0.0</IPSubnet>
<IPSubnet>255.255.0.0</IPSubnet>
<IPSubnet>255.255.255.0</IPSubnet>
</IPSubnets>
</Adapter>
</Adapters>
我正在尝试将选定的IPAddress与相应的IPSubnet对齐,如下所示:
Set adaptersDoc = CreateObject("Microsoft.XMLDOM")
adaptersDoc.SetProperty "SelectionLanguage", "XPath"
adaptersDoc.Async = False
adaptersDoc.Load("adapt.xml")
For Each ipNode In adaptersDoc.selectNodes("//IPAddresses/IPAddress")
WScript.Echo "ipNode", ipNode.Text
WScript.Echo "subnet", ipNode.selectSingleNode("//IPSubnets/IPSubnet[ count(preceding-sibling::IPAddress)+1 ]").Text
Next
我目前的输出是:
ipNode 1.1.1.1
subnet 255.0.0.0
ipNode 2.2.2.2
subnet 255.0.0.0
ipNode 3.3.3.3
subnet 255.0.0.0
我想要的输出是:
ipNode 1.1.1.1
subnet 255.0.0.0
ipNode 2.2.2.2
subnet 255.255.0.0
ipNode 3.3.3.3
subnet 255.255.255.0
我试图让xpath选择与IPAddress位置相关的IPSubnet元素的相同位置。
显然,count(previous-sibling :: IPAddress)并没有做我认为应该做的事情。
看起来这应该有效,因为节点上下文知道它自己的前后兄弟,但是当我尝试将它用作IPSubnet [x]的索引时,它并没有给我期望的结果。
我需要在XPath字符串中执行此操作,而不是通过更改程序来执行迭代节点和使用计数器或节点和子节点的长度等内容。
有什么建议吗?
答案 0 :(得分:0)
谢谢你har07。 我看到了我的方式的错误。它没有点击上下文节点移动,直到你指出它为止,我把它扔进C#,用一个真正的调试器来查看节点。
我试图避免进行代码更改,因为在数据集中的其他实例中使用了相同的技术。
因为我必须做出改变,所以我的路线略有不同:
ipXPath="//IPAddresses/IPAddress"
subnetXPath="//IPSubnets/IPSubnet[ $position()$ ]"
i=0
For Each ipNode In adaptersDoc.selectNodes(ipXPath)
i=i+1
WScript.Echo "ipNode", ipNode.Text
WScript.Echo "subnet", ipNode.selectSingleNode( Replace(subnetXPath,"$position()$",CStr(i)) ).Text
Next
它做我需要做的事情。谢谢你的帮助。