我想选择一些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为什么长!
请注意,这不是我试图访问这些节点的值的唯一途径。 我只是不知道是什么,我做错了。 可能有人请帮助我。 干杯。
首先停止这样做:
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为“帕斯卡套管”。
简答
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
如你看到的
- 我用标准/批准的方法来检查的单一步骤的结果(例如parseError(而不是巫长度试验),以查看是否我有一个形成的阱/有效/可用文件)
- 如果有疑问,我把一个WScript.Echo,以确保我什么VBScript中应该提供的装水的假设。
好了,我终于摸索出我在做什么错。 当我检索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是大小写敏感的是阻止我选择相关的节点。