0

我从这个链接得到以下 xml 结果 - https://api.eveonline.com/eve/CharacterID.xml.aspx?names=BorisKarlov

<eveapi version="2">
<currentTime>2013-01-16 18:57:38</currentTime>
<result>
<rowset name="characters" key="characterID" columns="name,characterID">
<row name="BorisKarlov" characterID="315363291"/>
</rowset>
</result>
<cachedUntil>2013-02-16 18:57:38</cachedUntil>
</eveapi>

我正在尝试将 characterID 提取到 asp.xml 中。我正在使用以下代码,

Set oXML = Server.CreateObject("Msxml2.DOMDocument.6.0")
oXML.LoadXML("https://api.eveonline.com/eve/CharacterID.xml.aspx?names=BorisKarlov")

Set oRoot = oXML.selectSingleNode("//result")

For Each oNode In oRoot.childNodes
  response.Write oNode.Attributes.getNamedItem("characterID").Text
Next 

Set oXML = Nothing 

我一直得到的是以下错误:

Microsoft VBScript 运行时错误“800a01a8”

需要对象:'oRoot'

......

我只能假设 Set oRoot = oXML.selectSingleNode("//result") 实际上没有生成任何数据,因此在下一行抛出错误。

任何人都可以阐明我的问题吗?

4

1 回答 1

1

你有几个问题。

  1. loadXML()用于将 XML 块加载为字符串,而不是从远程服务器获取;为此,您需要使用load()
  2. 从服务器加载时,您需要告诉它使用ServerXMLHTTP 组件,并将 async 设置为 false 以便它等到加载后再执行脚本的其余部分。
  3. 当我尝试加载该 XML 时,出现编码错误;您将需要以一种或另一种方式解决该问题
  4. 当我直接从字符串加载 XML 时,它不会解析,因为有一个包含非 XML 内容的脚本元素;需要包含在CDATA 部分中
  5. 您的 XPath 查询是 to //result,但您实际上需要它//result/rowset

解决上述问题 3 和 4 后,此代码应该可以工作:

Set oXML = Server.CreateObject("Msxml2.DOMDocument.6.0")
oXML.async = False
oXML.setProperty "ServerHTTPRequest", true

oXML.Load("https://api.eveonline.com/eve/CharacterID.xml.aspx?names=BorisKarlov")

If oXML.parseError.errorCode <> 0 Then
    Response.Write "<p>XML parse error: " & Server.HTMLEncode(oXML.parseError.reason) & "</p>"
Else
    Set oRoot = oXML.selectSingleNode("//result/rowset")

    If oRoot Is Nothing Then
        response.write "Nothing!"
        response.end
    End If

    For Each oNode In oRoot.childNodes
        response.Write oNode.Attributes.getNamedItem("characterID").Text
    Next
End If

Set oXML = Nothing

编辑:为了解决问题#3,奇怪的是#4(不知道为什么!),使用这个片段来加载XML。出于某种原因,我认为上面的代码没有正确处理 gzip 压缩流,但下面的代码可以。

Set oXML = Server.CreateObject("Msxml2.DOMDocument.6.0")
Set xh = Server.CreateObject("Msxml2.ServerXMLHTTP.6.0")
xh.open "GET", "https://api.eveonline.com/eve/CharacterID.xml.aspx?names=BorisKarlov", False
xh.send
xml = xh.responseText
oXML.LoadXML xml
于 2013-01-17T23:06:57.063 回答