0

我有一个函数api_request,它将 API 方法作为参数,并返回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>

这在 Sub 中进行解析error_handler,并根据错误选择以下操作。

此代码有效,但我必须检查是否 ElseIf s.Name = "error" 每次都遇到这样的错误,尽管所有方法都调用该api_request函数。是否可以在返回 Reader 之前检查 api_request 函数中的错误?问题是如果我在那里开始读取 xml,并且没有错误,我无论如何都无法将 Reader 定位到开头。

4

1 回答 1

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
于 2012-05-14T14:21:02.430 回答