【问题标题】:Issue in parsing XML with Classic ASP (VBscript)使用经典 ASP (VBscript) 解析 XML 的问题
【发布时间】:2015-04-26 12:12:30
【问题描述】:

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

我正在阅读的 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

【问题讨论】:

  • “不起作用”不是错误描述。您需要更好地分析问题。
  • 我猜你是对的。这个循环For Each xmlItem In xmlList 不会事件执行一次。这意味着它找不到CURRENCY 标签。但它就在那里
  • 加载 XML 文档后不会进行任何错误检查。在尝试load 操作后,您应该检查the parseError property

标签: vbscript asp-classic xml-parsing


【解决方案1】:

我怀疑(提前猜测)在服务器端处理 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

【讨论】:

  • 自从您回答以来,我一直在成功使用它。今天我开始收到错误:msxml6.dll error '80070005', Access is denied. - 指的是LoadXmlDocument.Load url。我猜它是服务器权限错误,但有没有办法让这段代码对错误更加友好?谢谢
  • @kneidels “访问被拒绝”可能是由于远程服务器返回 HTTP 401 造成的。当服务器返回无效的 XML 时,您也会收到错误,两行之后。底线是:LoadXmlDocument() 可能会失败。调用时使用On Error Resume Next 并适当地处理错误。之后不要忘记立即设置On Error Goto 0。阅读blogs.msdn.com/b/ericlippert/archive/2004/08/19/…,了解 VBS 错误处理的深入描述。
  • 谢谢。根据您的经验,如果我可以在浏览器中加载 xml,但通过 msxml 得到错误 - 这是否表明 xml 文件或 xml 组件有问题?
【解决方案2】:

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

Server.CreateObject("MSXML2.FreeThreadedDOMDocument")

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

编辑

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

似乎也有效

【讨论】:

    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多