0

api_requestAPIメソッドを引数として取り返す関数があります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_handlerSubで解析され、エラーに応じて次のアクションが選択されます。

このコード は機能しますが、すべてのメソッドが関数を呼び出しますが、ElseIf s.Name = "error" 毎回api_requestそのようなエラーが発生するかどうかを確認する必要があります。リーダーを返す前にapi_request関数のエラーをチェックすることは可能ですか?問題は、そこでxmlを読み始めてもエラーがない場合、とにかくリーダーを先頭に配置できないことです。

4

1 に答える 1

1

で位置を変更することはできないため、XmlTextReader他の唯一の解決策は、XMLドキュメント全体をメモリにロードすることです。おそらく、XmlTextReaderとにかく最初にXMLファイルを読み取るときに、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
于 2012-05-14T14:21:02.430 に答える