2015-04-26 136 views
1

我有下面的代碼,它用來完美的工作,但現在出於某些原因,沒有。用經典ASP解析XML問題(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 
+0

「不工作」不是錯誤描述。你需要在分析問題方面做得更好。 – Tomalak

+0

我想你是對的。這個循環'For Each xmlItem In xmlList'不會事件執行一次。這意味着它找不到'CURRENCY'標籤。但它存在 – kneidels

+0

加載XML文檔後,您不會執行任何錯誤檢查。在嘗試執行「加載」操作後,您應該檢查[parseError'屬性](https://msdn.microsoft.com/en-us/library/ms756041%28v=vs.85%29.aspx)。 – Tomalak

回答

2

我懷疑(野生猜測未來)變爲雙向SSL服務器上的處理這是你麻煩的原因。也許他們爲了迴應最近的SSL錯誤而禁用了更老的,更不安全的密碼。

像@約翰筆記 - 當您從MSXML2.FreeThreadedDOMDocument(它加載版本MSXML2版本3)更改爲明確加載更現代的版本6(MSXML2.FreeThreadedDOMDocument.6.0),然後下載文檔成功。

這就是說,我已經對代碼做了一些更改,主要是爲了更易讀,並且在文檔加載因某種原因失敗時使其失敗。

  • 代替盲目進行索引子節點
  • parseError檢查,以LoadXmlDocument使用XPath的
  • 一個輔助函數GetText()失敗非默默

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 
+0

自從你的回答以來,我一直在使用它。今天我開始得到一個錯誤:'msxml6.dll錯誤'80070005',訪問被拒絕。 ' - 引用'LoadXmlDocument.Load url'這一行。我猜測它的服務器權限錯誤,但有沒有辦法讓這段代碼更容易錯誤?謝謝 – kneidels

+1

@kneidels「訪問被拒絕」可能是由遠程服務器返回HTTP 401引起的。當服務器返回無效的XML時,您將在兩行後發生錯誤。底線是:'LoadXmlDocument()'可能會失敗。當您調用它並正確處理錯誤時,請使用'On Error Resume Next'。不要忘記隨後立即設置「On Error Goto 0」。閱讀http://blogs.msdn.com/b/ericlippert/archive/2004/08/19/error-handling-in-vbscript-part-one.aspx,瞭解VBS錯誤處理的深入描述。 – Tomalak

+0

謝謝。根據你的經驗,如果我可以在瀏覽器中加載xml,但通過msxml獲取錯誤 - 這是否表示xml文件或xml組件存在問題? – kneidels

3

我剛在我的機器上試過這個。試着用

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

更換

Server.CreateObject("MSXML2.FreeThreadedDOMDocument") 

編輯

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

也似乎工作