使用 Classic ASP (VBscript) 解析 XML 时出现问题

Issue in parsing XML with Classic ASP (VBscript)

我有以下代码,它曾经完美地工作,但现在由于某些原因,不能。

我正在阅读的 XML 位于:https://forex.boi.org.il/currency.xml

下面的代码应该解析 XMl 然后保存 USD/ILS 汇率。正如我所说,它不再存在了,我不知道出了什么问题。

forexURL = "https://forex.boi.org.il/currency.xml"

getUSDRate = 0 
MyRate = 0 

Set xmlObj = Server.CreateObject("MSXML2.FreeThreadedDOMDocument")
xmlObj.async = False
xmlObj.setProperty "ServerHTTPRequest", True
xmlObj.Load(forexURL)
Set xmlList = xmlObj.getElementsByTagName("CURRENCY")
Set xmlObj = Nothing
x = 1
For Each xmlItem In xmlList

    response.write "<p>" &  xmlItem.childNodes(0).text
    response.write "<p>" &    xmlItem.childNodes(1).text
    response.write "<p>" &   xmlItem.childNodes(2).text
    response.write "<p>" &   xmlItem.childNodes(3).text
    response.write "<p>" &   xmlItem.childNodes(4).text
    response.write "<p>" &   xmlItem.childNodes(5).text
    response.write "<p>___________________<br />" & x & "</p>"

    if xmlItem.childNodes(2).text = "USD" then 
        MyRate = xmlItem.childNodes(4).text
        exit for
    end if 

    x = x +1

Next
Set xmlList = Nothing

我刚在我的机器上试过这个。尝试替换

Server.CreateObject("MSXML2.FreeThreadedDOMDocument")

Server.CreateObject("Msxml2.DomDocument.6.0")

编辑

Server.CreateObject("MSXML2.FreeThreadedDOMDocument.6.0") 

似乎也有效

我怀疑(提前猜测)更改服务器端处理 SSL 的方式是您遇到麻烦的原因。也许他们禁用了旧的、更不安全的密码以响应最近的 SSL 错误。

就像@John 指出的那样 - 当您从 MSXML2.FreeThreadedDOMDocument(加载版本 MSXML2 版本 3)更改为显式加载更现代的版本 6(MSXML2.FreeThreadedDOMDocument.6.0)时,文档下载成功。

也就是说,我对您的代码进行了一些更改,主要是为了提高可读性,并在文档加载因某种原因失败时使其明显失败。

备注

  • XPath的使用
  • 辅助函数GetText()代替盲目索引子节点
  • parseError 检查使 LoadXmlDocument 非静默失败

.

Option Explicit

Dim usdRate, x, currencies, curr

Set currencies = LoadXmlDocument("https://forex.boi.org.il/currency.xml")
usdRate = GetText(currencies, "//CURRENCY[CURRENCYCODE = 'USD']/RATE")

x = 1
For Each curr In currencies.getElementsByTagName("CURRENCY")
    Response.Write "<p>" & GetText(curr, "NAME") & "</p>"
    Response.Write "<p>" & GetText(curr, "UNIT") & "</p>"
    Response.Write "<p>" & GetText(curr, "CURRENCYCODE") & "</p>"
    Response.Write "<p>" & GetText(curr, "COUNTRY") & "</p>"
    Response.Write "<p>" & GetText(curr, "RATE") & "</p>"
    Response.Write "<p>" & GetText(curr, "CHANGE") & "</p>"
    Response.Write "<p>___________________<br />" & x & "</p>"
    x = x + 1
Next
' ----------------------------------------------------------------------

' loads an XML document from a URL and returns it
Function LoadXmlDocument(url)
    Set LoadXmlDocument = CreateObject("MSXML2.FreeThreadedDOMDocument.6.0")
    LoadXmlDocument.async = False
    LoadXmlDocument.setProperty "ServerHTTPRequest", True
    LoadXmlDocument.setProperty "SelectionLanguage", "XPath"
    LoadXmlDocument.Load url
    If LoadXmlDocument.parseError <> 0 Then
        Err.Raise vbObjectError + 1, _
            "LoadXmlDocument", _
            "Cannot load " & url & " (" & LoadXmlDocument.parseError.reason & ")"
    End If
End Function

' finds the first node that matches the XPath and returns its text value
Function GetText(context, xpath)
    Dim node
    Set node = context.selectSingleNode(xpath)
    If node Is Nothing Then
        GetText = vbEmpty
    Else
        GetText = node.text
    End If
End Function