2012-05-09 23 views
0

私はサイトのAPIにリクエストをするために別の場所からこの関数を呼び出し、メソッドの結果に応じて、引数としてAPIの方法をとる関数api_requestを得た、と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 

を返してきましたが、非常に異なっ解析されます。ご覧の通り、私はコードElseIf s.Name = "error" Then error_handler(s, "user.get")を持って

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 

だから、それぞれの方法で私はこのような何かを持っています。

<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

おかげで、それは私が探していたまさにです –

関連する問題