Vbscript 如何查询具有名称空间属性的XML文件

Vbscript 如何查询具有名称空间属性的XML文件,vbscript,xml-namespaces,msxml,Vbscript,Xml Namespaces,Msxml,感谢一个很棒的论坛,这真的是一个丰富的知识,希望在寻找一个解决方案,我可以帮助别人 我想知道是否有一个善良的灵魂可以帮助我,通过一个代码示例来解析这里显示的xml代码,建议如何或可能地为我指明正确的方向。 我一直在网上搜索vbscript示例,但我真的在努力寻找一个解决问题的示例 web上的大多数示例都显示了如何提取节点或子节点中的特定标记或文本匹配,但没有解释如何引用我对该代码感兴趣的部分 我已经有了运行良好的python代码,但vbscript让我感到困惑:-( xmlDOC定义了vAPP的

感谢一个很棒的论坛,这真的是一个丰富的知识,希望在寻找一个解决方案,我可以帮助别人

我想知道是否有一个善良的灵魂可以帮助我,通过一个代码示例来解析这里显示的xml代码,建议如何或可能地为我指明正确的方向。 我一直在网上搜索vbscript示例,但我真的在努力寻找一个解决问题的示例

web上的大多数示例都显示了如何提取节点或子节点中的特定标记或文本匹配,但没有解释如何引用我对该代码感兴趣的部分

我已经有了运行良好的python代码,但vbscript让我感到困惑:-(

xmlDOC定义了vAPP的环境设置,我感兴趣的部分是:
oe:key
oe:value
,用于
下的每个节点

我需要将密钥和值存储在一个文本文件中,其中包含如下条目

bootflag=a clusetername=cluster test bootflag=a clusetername=群集测试 等等。以下是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>

VMware ESXi
5.5.0
VMware公司。
EN
我真的很感激任何帮助


编辑:根据下面的回复,我尝试了这段代码,但我确信我在填写节点信息时出错了,特别是“oe:key”和“oe:value”

请在下面查找更新代码:

Set objDoc=CreateObject(“MSXML.DOMDocument”)
objDoc.Load(“c:\Temp\ovfenv.xml”)
'迭代元素中包含的所有元素:
设置objRoot=objDoc.documentElement
s=“”
t=“”
对于objRoot.childNodes中的每个子节点
s=s&child.getAttribute(“oe:key”)&“
t=t&child.getAttribute(“oe:value”)&“
下一个
MsgBox s
MsgBox t
'使用XPath查找特定元素:
设置objNode=objDoc.selectSingleNode(“/PropertySection/Property[@oe:key='bootflag']”)
MsgBox objNode.getAttribute(“oe:value”)

查看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
Set objDoc=CreateObject(“MSXML.DOMDocument”)
加载“C:\Temp\Test.xml”
'迭代元素中包含的所有元素:
设置objRoot=objDoc.documentElement
s=“”
t=“”
对于objRoot.childNodes中的每个子节点
s=s&child.getAttribute(“名称”)和
t=t&child.getAttribute(“值”)和
下一个
MsgBox s'显示“alpha-beta-gamma”
MsgBox t'显示“1 2 3”
'使用XPath查找特定元素:
设置objNode=objDoc.selectSingleNode(“/root/property[@name='beta']”)
MsgBox objNode.getAttribute(“值”)显示2
你差点就成功了

您必须-在MSXML中,就像在其他所有API实现中一样-

Option Explicit'这也是个好主意!
Dim文档,ns,节点
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”)
如果不是,则节点为空
MsgBox node.nodeValue
其他的
MsgBox“未找到任何内容!”
如果结束

感谢您的回复和提示,遗憾的是,当我更改代码以适应XML文件和节点信息时,一切都不起作用。我最终得到了错误800A01A8第9行字符1:需要对象的“objRoot”……我确信我的标记/路径不正确,而这正是我一直在努力解决的问题,因为节点是oe:value和oe:value:-(这是我基于您发送的信息编写的代码。我还尝试了许多其他适用于usuall标记的xml文档的示例,但这确实让我感到困惑。这是我的代码:Set objDoc=CreateObject(“MSXML.DOMDocument”)objDoc.Load(“c:\Temp\ovfenv.xml”)'迭代元素中包含的所有元素:为objRoot.childNodes=s&child.getAttribute(“oe:key”)&“t=t&child.getAttribute(“oe:value”)&”中的每个子元素设置objRoot=objDoc.documentElement s=“”t=“”下一个MsgBox s'show oe:key MsgBox t'show oe:value'使用XPath查找特定元素:“Set objNode=objDoc.selectSingleNode(“/PropertySection/Property[@oe:key='bootsflag']”)MsgBox objNode.getAttribute(“oe:value”)'显示值并且您已经编辑了我的整个问题和主题?您在MSDN上引用的代码页根本没有显示vbscript的示例?请告诉我您为什么更改了我的邮件标题?您已经删除了我寻求帮助和引用的提示行,以下是我的请求:我一直在网上搜索vbscript示例,但我真的在努力寻找一个解决问题的方法“…请接受我的道歉,因为错误地指导…仍然不确定是否可以在这里发布:-(并且在XML代码和混乱中迷失了方向:-)@Tomalak..再次感谢您的回复…请原谅混乱。ns是否在这里引用了“xmlns:oe=”“在作为加载的xml文档的ns引用点发布的代码中?您是否尝试了发布的代码并取得了成功?我只是不断收到一个消息框,说明未找到任何内容谢谢您Tomalak。但不幸的是,您的解决方案也不起作用:-(消息框一直报告未找到任何内容:-(.当您运行此脚本的计算机没有internet时会发生什么情况?奇怪的是,用户必须引用这样的网站,不是吗?没有本地选项吗?您不需要internet,名称空间仅通过约定以URL形式存在。没有实际的http请求。请在加载XML文档后检查是否存在错误。如果没有错误,一点一点地测试XPath,直到找到它的断点。仔细检查所有内容,因为我的代码实际上是针对您提供的示例XML工作的。