在VBScript中解析XML字符串

6
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个Web服务,返回类似于以下XML字符串:

<?xml version="1.0"?>
<Result>
    <PersonID>991166187</PersonID>
    <AddressID>1303836</AddressID>
</Result>

我需要一段VBScript代码,可以让我检索PersonIDAddressID的值。我的具体问题是如何从原始帖子中的XML字符串检索PersonID的值,即991166187

就我尝试过的内容而言,我有以下代码:

Dim doc
Dim xmlString
Dim nodes
Dim idArray

xmlString = "<?xml version="1.0"?><Result><PersonID>991166187</PersonID><AddressID>1303836</Address&#8204;&#8203;ID></Result>"

Set doc = CreateObject("MSXML2.DOMDocument")
doc.loadXML(xmlString)

'Set nodes = doc.selectNodes("Result/PersonID/AddressID")
nodes = doc.getElementsByTagName("PersonID")

For Each node In nodes
  WScript.Echo "Person ID: " & node.text

你能展示一下你已经研究过的内容吗?你有没有一个具体的问题需要询问?你可以展示一下你已经尝试过的东西,并告诉我们哪些是不起作用的吗? - rory.ap
我的具体问题是如何从我原始帖子中的xml字符串中检索PersonID值,即991166187。就我尝试过的内容而言,我有以下代码。 - Babs
我的具体问题是如何从我原帖中的xml字符串中检索出PersonID即991166187的值。在我尝试过的方面,我有以下代码:`Dim doc Dim xmlString Dim nodes Dim idArray xmlString="<?xml version="1.0"?><Result><PersonID>991166187</PersonID><AddressID>1303836</AddressID></Result>" Set doc = CreateObject("MSXML2.DOMDocument") doc.loadXML(xmlString)'Set nodes = doc.selectNodes("Result/PersonID/AddressID")nodes = doc.getElementsByTagName("PersonID")For each node in nodes WSCript.Echo "Person ID: " & node.text ` - Babs
2
请不要在评论区粘贴代码。请编辑您的问题。格式化代码以便我们阅读。 - rory.ap
你在网上找到了什么?在发帖之前,你有尝试过搜索答案吗? - rory.ap
4个回答

7

我看了你的代码,有几个需要修改的地方:

  1. 你得到的XML字符串中有双引号。你不能直接使用这些双引号并将其保存到一个字符串中。你有两个选择:
    1. 从字符串创建一个XML文件并解析
    2. 使用 Replace 将双引号替换为单引号
  2. getElementsByTagName 行应该有一个 Set,因为返回的值是一个对象。

我在我的机器上使用了这段代码,并成功地检索到了所需的输出结果:

Dim doc 
Dim xmlString 
Dim nodes
xmlString = "<?xml version='1.0'?><Result><PersonID>991166187</PersonID><AddressID>1303836</AddressID></Result>"

Set doc = CreateObject("MSXML2.DOMDocument") 
doc.loadXML(xmlString) 
Set nodes = doc.getElementsByTagName("PersonID")

For Each node In nodes
  MsgBox "Person ID: " & node.text
Next
MsgBox "done"

转义双引号("<?xml version=""1.0""?>...")也可以起作用。 - Ansgar Wiechers
花费了好几个小时尝试从变量中加载 xmldom,但是大家都只从文件加载,但当它来自于读取来自 xml feed (rest call) 时,那样并不能起作用。loadXML 方法正是我所需要的,非常感谢。另外,在我的情况下只有一个节点作为目标,getElementsByTagName 的效果很好。 - nenea

3

可以使用带有XPath表达式的selectNodes作为getElementsByTagName的替代方法。

Set doc = CreateObject("MSXML2.DOMDocument")
doc.loadXML xmlString

If doc.parseError <> 0 Then
  WScript.Echo doc.parseError.reason
  WScript.Quit 1
End If

Set nodes = doc.selectNodes("/Result/PersonID")

For Each node In nodes
  WScript.Echo "Person ID: " & node.text
Next

如果您不知道(或不关心)PersonID子节点的确切路径,请将/Result/PersonID更改为//PersonID。此外,要注意XPath表达式区分大小写。


2
请使用下面的代码。
Dim oXML
Set oXML = CreateObject("Microsoft.XMLDOM")

'Load the XML file
oXML.Load("D:\Projects\QTP Project\TestAutomation\Extra\PersonID.xml")
'Loop through each nodes
For Each oChdNd In oXML.DocumentElement.ChildNodes
   WScript.Echo oChdNd.nodeName&":"&oChdNd.text&vbCrLf
Next

1
只有当所涉及的节点是根节点的直接子节点时,此方法才有效。另外,Microsoft.XMLDOM已经过时,不应再使用(请改用Msxml2.DOMDocument)。 - Ansgar Wiechers

-3

1
我喜欢正则表达式,但是在有适当的XML API可用时,使用它来解析XML绝对是不可取的。 - Sascha L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接