2012-05-09 42 views
0

我有一個功能api_request這需要API方法作爲參數,並返回XMLTextReaderxml解析錯誤處理或如何將XMLTextReader的光標重新啓動?

Shared Function api_request(method As String) As XmlTextReader 
request_text = method & ".xml" 
url = "https://api.vk.com/method/" & request_text & "&access_token=" & token 
Return New XmlTextReader(url) 
End Function 

我呼籲來自不同地方的這種功能,使請求的網站和API取決於方法結果被解析非常不同。

因此,在每一個方法我有這樣的事情:

Dim s As Xml.XmlReader = api_request("users.get") 
While s.Read 
     If s.NodeType = XmlNodeType.Element Then 
      If s.Name = "user" Then 
       curr_user=s.ReadElementContentAsString    
      ElseIf s.Name = "error" Then 
      error_handler(s, "user.get") 
      End If 
     End If 
End While 

正如你可以看到,我的代碼ElseIf s.Name = "error" Then error_handler(s, "user.get")。這是因爲當錯誤發生,服務器總是返回是這樣的:

<error> 
<error_code>4</error_code> 
<error_msg>Incorrect signature</error_msg> 
</error> 

這在error_handler子分析,並根據錯誤下列行爲選擇。

此代碼的工作,但我要檢查,如果我遇到的錯誤一樣,ElseIf s.Name = "error"時間,但所有的方法調用api_request功能。在返回Reader之前是否可以檢查api_request函數中的錯誤?問題是如果我在那裏開始閱讀XML,並且沒有錯誤,我不能將Reader定位到開始位置。

回答

1

由於您無法通過XmlTextReader更改您的職位,唯一的解決方案是將整個XML文檔加載到內存中。假設XmlTextReader在第一次讀取時會將整個XML文件下載到內存中,所以任何性能下降都應該可以忽略不計。我建議是這樣的:

Shared Function api_request(ByVal method As String) As XmlDocument 
    request_text = method & ".xml" 
    url = "https://api.vk.com/method/" & request_text & "&access_token=" & token 
    Dim doc As XmlDocument = New XmlDocument() 
    doc.Load(New XmlTextReader(url)) 
    Dim node As XmlNode = doc.SelectSingleNode("error") 
    If node IsNot Nothing Then 
     Try 
      Dim errorCode As Integer = Integer.Parse(node.SelectSingleNode("error_code").InnerText) 
      Dim errorMessage As String = node.SelectSingleNode("error_msg").InnerText 
      errorHandler(errorCode, errorMessage, method) 
      doc = Nothing 
     Catch ex As Exception 
      Throw New Exception("Improperly formatted error response: " + doc.InnerXml, ex) 
     End Try 
    End If 
    Return doc 
End Function 

然後在調用api_request,這樣做的方法:

Dim doc As XmlDocument = api_request("users.get") 
    If doc IsNot Nothing Then 
     For Each node As XmlNode In doc.SelectNodes("path_to_user/user") 
      curr_user = node.InnerText 
     Next 
    End If 
+0

感謝,這正是我一直在尋找 –