VBScript中无法选择XML节点(VBScript Can not Select XML nod

2019-07-30 02:24发布

我想选择一些web服务响应XML无济于事节点。 出于某种原因,我能够选择根节点(“XMLDATA”),但是,当我尝试越钻越深(“XMLDATA /用户”),一切都返回空! 下面是由Web服务返回的XML的一个样本。

<xmldata>
  <customers>
    <customerid>22506</customerid>
    <firstname>Jim</firstname>
    <issuperadmin>N</issuperadmin>   
    <lastname>Jones</lastname>
  </customers>
</xmldata>

这里是我想选择客户ID,姓名代码和姓氏;

' Send the Xml
oXMLHttp.send Xml_to_Send

' Validate the Xml
dim xmlDoc
set xmlDoc = Server.CreateObject("Msxml2.DOMDocument")
xmlDoc.load (oXMLHttp.ResponseXML.text)
if(len(xmlDoc.text) = 0) then
    Xml_Returned = "<B>ERROR in Response xml:<BR>ERROR DETAILS:</B><BR><HR><BR>" 
end if

dim nodeList
Set nodeList = xmlDoc.SelectNodes("xmldata/customers")

For Each itemAttrib In nodeList
    dim custID, custLname, custFname    
    custID =itemAttrib.selectSingleNode("customerid").text
    custLname =itemAttrib.selectSingleNode("lastname").text
    custFname =itemAttrib.selectSingleNode("firstname").text
    response.write("News Subject: " & custID)
    response.write("<br />News Subject: " & custLname)
    response.write("<br />News Date: " & custFname)
Next

上面的代码的结果是小人物! 没有数据被写入到该页面。 一个奇怪的是,如果我选择根元素,并获得它的长度如下:

Set nodeList = xmlDoc.SelectNodes("xmldata")
Response.Write(nodeList.length) '1 is written to page

它正确地确定的1长度然而,当我尝试与下一个节点向下如下相同;

Set nodeList2 = xmlDoc.SelectNodes("xmldata/customers")
Response.Write(nodeList.length) '0 is written to page

它返回0为什么长!

请注意,这不是我试图访问这些节点的值的唯一途径。 我只是不知道是什么,我做错了。 可能有人请帮助我。 干杯。

Answer 1:

首先停止这样做:

Dim doc : Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.LoadXML (oXmlHttp.responseXML.xml)

XML的响应被解析成一个DOM,然后您可以要求被转换回一个字符串(.XML),然后解析(再次)进入另一个DOM(.LoadXML)。

做简单:

Dim xmlDoc : Set xmlDoc = oXmlHttp.responseXML

其次,你在你的答案正确的XPath是区分大小写,因此您的XPath(除了那些Ekkehard已经指出的.text混日子)将无法工作,因为你越来越不匹配,你以为你都拿到了XML。

最后“骆驼套管”的定义是不变化,但一般这种“邮寄地址”是骆驼套管而这个“的PostalAddress”被refered为“帕斯卡套管”。



Answer 2:

简答

oXMLHttp.ResponseXML.text可能会返回一些文本,但不按要求.load的参数“A包含指定XML文件的位置的URL字符串”。 所以更换

xmlDoc.load (oXMLHttp.ResponseXML.text)

xmlDoc.loadXml oXMLHttp.ResponseXML.xml

如果这行不通“,这样说; 然后我会尽量提供更长的答案。

(PS的答案很简单:AnthonyWJones的意见并不两次转换XML是健全的,我提供了这个‘现有的,希望代码’的方式过了第一关,以获得OT,而不是作为一个普遍适用的策略的影响最小。)

更长的答案

如果你有一个ASP页面上的XML的问题,你应该尝试在一个控制台脚本以隔离和测试XML具体问题。 对于你的问题,我填的骨架(负载.xml文件,检查是否有错误)的代码通过XPath和DOM树接入节点:

  Dim oFS    : Set oFS  = CreateObject( "Scripting.FileSystemObject" )
  Dim sFSpec : sFSpec   = oFS.GetAbsolutePathName("..\data\00.xml")
  Dim oXml   : Set oXml = CreateObject("Msxml2.DOMDocument")

  oXml.setProperty "SelectionLanguage", "XPath"
  oXml.async = False
  oXml.load sFSpec

  If 0 = oXml.parseError.errorCode Then
     WScript.Echo "loaded:", sFSpec
     WScript.Echo "root:", oXml.documentElement.tagName

     Dim sXPath, ndlFnd, ndChild, ndFnd

     sXPath = "/xmldata/customers"
     Set ndlFnd = oXml.selectNodes(sXPath)
     If 0 = ndlFnd.length Then
        WScript.Echo "no '" & sXPath & "' found"
     Else
        WScript.Echo "found", ndlFnd.length, "node(s) for '" & sXPath & "'"
        sXPath = "firstname"
        For Each ndChild In ndlFnd
            WScript.Echo "child:", ndChild.tagName
            Set ndFnd = ndChild.selectSingleNode(sXPath)
            If ndFnd Is Nothing Then
               WScript.Echo "no '" & sXPath & "' found"
            Else
               WScript.Echo ndFnd.text, "==", ndChild.childNodes(1).text
            End If
        Next
     End If
  Else
     WScript.Echo "errorCode:", oXml.parseError.errorCode
     WScript.Echo oXml.parseError.reason
  End If

输出:

loaded: E:\trials\SoTrials\answers\11166940\data\00.xml
root: xmldata
found 1 node(s) for '/xmldata/customers'
child: customers
Jim == Jim

如你看到的

  1. 我用标准/批准的方法来检查的单一步骤的结果(例如parseError(而不是巫长度试验),以查看是否我有一个形成的阱/有效/可用文件)
  2. 如果有疑问,我把一个WScript.Echo,以确保我什么VBScript中应该提供的装水的假设。


Answer 3:

好了,我终于摸索出我在做什么错。 当我检索XML是从一个Web服务,我有关于它的信息有限,我用下面的XML编写的网页,这样我可以看看它是如何构成的。

Response.Write oXMLHttp.ResponseXml.xml

出于某种原因(也许有人可以填补这部分),它写的所有的XML标签小写。 事实证明,经过一番调查,并执行以下操作后,我发现这不是事实!

dim nodeList
Set nodeList = xmlDoc.SelectNodes("//xmldata/")

for each item In nodeList
    response.write(item.text & " -> Tag Name: " & item.nodeName & "<br />")
Next

'this wrote the following to the page
'22506 -> Tag Name: CustomerID
'Jim -> Tag Name: FirstName
'N -> Tag Name: IsSuperAdmin
'Jones 2 -> Tag Name: LastName

正如你所看到的“节点名称”属性输出显示的标签是骆驼。 这样的responseXML相当误导,看到XPath是大小写敏感的是阻止我选择相关的节点。



文章来源: VBScript Can not Select XML nodes