没有从xml文件获取属性到asp

时间:2013-01-16 21:38:26

标签: asp-classic xml-parsing

我从此链接获得以下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中。我使用以下代码,

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”)实际上并没有生成任何数据,因此会在下一行中抛出错误。

任何人都可以对我的问题有所了解吗?

1 个答案:

答案 0 :(得分:1)

你有一些问题。

  1. loadXML()用于将XML块作为字符串加载,而不是从远程服务器获取;为此,您需要使用load()
  2. 从服务器加载时,您需要告诉它使用ServerXMLHTTP component,并将async设置为false,以便在执行脚本的其余部分之前等待直到加载。
  3. 当我尝试加载该XML时,我遇到了编码错误;您需要解决one way or another
  4. 当我直接从字符串加载XML时,它不会解析,因为有一个包含非XML内容的脚本元素;需要包含在CDATA section
  5. 您的XPath查询是//result,但实际上您需要//result/rowset
  6. 一旦解决了上述问题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