如何查询与命名空间中的属性的XML文件(How to query an XML file with

2019-09-30 07:52发布

感谢您的真棒论坛它确实是一个丰富的知识,并希望在寻找一个解决方案,我可以帮助别人。

我不知道如果某种灵魂可以帮助我的建议如何或可能指向我朝着正确的方向与代码示例解析这里显示的XML代码。 我一直在寻找所有网站上的一个VBScript的例子,但真的很挣扎着找到一个解决问题。

大部分网络上的示例显示了如何提取特定的标签或文本中的节点或子节点相匹配,并且不太热的解释引用我有兴趣在此代码的部分。

我已经有Python代码工作正常,但VBScript中有我难住了:-(

所述xmlDoc中定义vApp的环境设置,我感兴趣的部分是: oe:keyoe:value下对于每个节点的<PropertySection>

我需要有钥匙,并存储在一个文本文件中包含的条目值

bootflag=a
clusetername=cluster test

等这里是XML文档:

<Environment xmlns="http://schemas.dmtf.org/ovf/environment/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oe="http://schemas.dmtf.org/ovf/environment/1" xmlns:ve="http://www.vmware.com/schema/ovfenv" oe:id="" ve:vCenterId="vm-167">
 <PlatformSection>
  <Kind>VMware ESXi</Kind>
  <Version>5.5.0</Version>
  <Vendor>VMware, Inc.</Vendor>
  <Locale>en</Locale>
 </PlatformSection>
 <PropertySection>
  <Property oe:key="bootflag" oe:value="A"/>
  <Property oe:key="clustername" oe:value="custer test"/>
  <Property oe:key="datacenter_name" oe:value="datacenter test"/>
  <Property oe:key="dns1" oe:value="192.168.1.198"/>
  <Property oe:key="domain" oe:value="zen.com"/>
  <Property oe:key="gateway" oe:value="192.168.1.1"/>
  <Property oe:key="hostname" oe:value="rambo1"/>
  <Property oe:key="ip" oe:value="192.168.1.104"/>
  <Property oe:key="netmask" oe:value="255.255.255.0"/>
  <Property oe:key="vcenter_password" oe:value="vpass"/>
  <Property oe:key="vcenterip" oe:value="1.2.3.4"/>
  <Property oe:key="vcenteruser" oe:value="vcenteruser"/>
 </PropertySection>
 <ve:EthernetAdapterSection>
  <ve:Adapter ve:mac="00:50:56:88:62:8a" ve:network="VM Network" ve:unitNumber="7"/>
  <ve:Adapter ve:mac="00:50:56:88:46:25" ve:network="VM Network" ve:unitNumber="8"/>
  <ve:Adapter ve:mac="00:50:56:88:31:59" ve:network="VM Network" ve:unitNumber="9"/>
  <ve:Adapter ve:mac="00:50:56:88:5e:00" ve:network="VM Network" ve:unitNumber="10"/>
 </ve:EthernetAdapterSection>
</Environment>

我真的很感激任何帮助。


编辑:基于下面我的答复试过这段代码,但我敢肯定,我与在节点信息填充走错了,特别是“OE:键”和“OE:值”。

请从下面的更新代码:

Set objDoc = CreateObject("MSXML.DOMDocument")
objDoc.Load ("c:\Temp\ovfenv.xml")
' Iterate over all elements contained in the <root> element:
Set objRoot = objDoc.documentElement

s = ""
t = ""
For Each child in objRoot.childNodes
   s = s & child.getAttribute("oe:key") & " "
   t = t & child.getAttribute("oe:value") & " "
Next
MsgBox s    
MsgBox t    

' Find a particular element using XPath:
Set objNode = objDoc.selectSingleNode("/PropertySection/Property[@oe:key='bootflag']")
MsgBox objNode.getAttribute("oe:value")

Answer 1:

你几乎拥有了。

你必须-在MSXML就像所有其他的API实现- 宣布你打算在XPath中使用的任何命名空间 。

Option Explicit  ' that's always a good idea, too!
Dim doc, ns, node

Set doc = CreateObject("MSXML.DOMDocument")
doc.Load "C:\Temp\ovfenv.xml"

ns = "xmlns:oe='http://schemas.dmtf.org/ovf/environment/1'"
doc.setProperty "SelectionNamespaces", ns

Set node = doc.selectSingleNode("//PropertySection/Property[@oe:key = 'bootflag']/@oe:value")

If Not node Is Nothing Then
  MsgBox node.nodeValue
Else
  MsgBox "Nothing found!"
End If


Answer 2:

退房fmunkert的答案- > 这里

更具体地讲,代码他记录在这里:

Set objDoc = CreateObject("MSXML.DOMDocument")
objDoc.Load "C:\Temp\Test.xml"

' Iterate over all elements contained in the <root> element:

Set objRoot = objDoc.documentElement
s = ""
t = ""
For Each child in objRoot.childNodes
   s = s & child.getAttribute("name") & " "
   t = t & child.getAttribute("value") & " "
Next
MsgBox s    ' Displays "alpha beta gamma "
MsgBox t    ' Displays "1 2 3 "

' Find a particular element using XPath:

Set objNode = objDoc.selectSingleNode("/root/property[@name='beta']")
MsgBox objNode.getAttribute("value")     ' Displays 2


文章来源: How to query an XML file with namespaced attributes