XML节点的VBScript位置,用作另一个节点的索引

时间:2015-04-22 06:24:36

标签: xml xpath vbscript wsh

我有以下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字符串中执行此操作,而不是通过更改程序来执行迭代节点和使用计数器或节点和子节点的长度等内容。

有什么建议吗?

1 个答案:

答案 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

它做我需要做的事情。谢谢你的帮助。