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に抽出しようとしています。私は次のコードを使用しています、

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 

私が取得し続けるのは、次のエラーだけです。

MicrosoftVBScriptランタイムエラー「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クエリはになりますが//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 に答える