0

我正在使用这个 API来查找用户所在的国家/地区。我能够在 XML 格式的网页上找到该国家/地区。在这里您可以看到 XML 文件示例。但问题是我无法在我的 c# 代码中读取此 XML。这是我的代码

string UserIP = Request.ServerVariables["REMOTE_ADDR"].ToString();
string ApiKey = "5d3d0cdbc95df34b9db4a7b4fb754e738bce4ac914ca8909ace8d3ece39cee3b";
string Url = "http://api.ipinfodb.com/v3/ip-country/?key=" + ApiKey + "&ip=" + UserIP;
XDocument xml = XDocument.Load(Url);

但是此代码在加载 xml 时返回以下异常。

System.Xml.XmlException:根级别的数据无效。第 1 行,位置 1。

请描述读取此 XML 的确切方法。

4

3 回答 3

2

我会说它不是一个 XML,而只是一个由以下内容细分的字符串;

通过给出一个不可能的 IP 地址,我们可以看到它是这样组成的:

OK;;74.125.45.100;US;UNITED STATES
ERROR;Invalid IP address.;127.0.0.1.1;;

OK/ERROR
If ERROR, complete ERROR message
IP Address
Abbreviation of country
Country name

这段代码应该这样做:

string userIP = "127.0.0.1";
string apiKey = "5d3d0cdbc95df34b9db4a7b4fb754e738bce4ac914ca8909ace8d3ece39cee3b";
string url = "http://api.ipinfodb.com/v3/ip-country/?key=" + apiKey + "&ip=" + userIP;

WebRequest request = WebRequest.Create(url);

using (var response = (HttpWebResponse)request.GetResponse())
{
    // We try to use the "correct" charset
    Encoding encoding = response.CharacterSet != null ? Encoding.GetEncoding(response.CharacterSet) : null;

    using (var sr = encoding != null ? new StreamReader(response.GetResponseStream(), encoding) :
                                       new StreamReader(response.GetResponseStream(), true))
    {
        var response2 = sr.ReadToEnd();
        var parts = response2.Split(';');

        if (parts.Length != 5)
        {
            throw new Exception();
        }

        string okError = parts[0];
        string message = parts[1];
        string ip = parts[2];
        string code = parts[3];
        string country = parts[4];
    }
}
于 2013-08-16T06:22:30.643 回答
1

来自IP 位置 XML API 文档:API 参数格式,必需 = false,默认 = 原始,值 = 原始,xml,json。所以我已经对其进行了测试并string Url = "http://api.ipinfodb.com/v3/ip-country/?key=" + ApiKey + "&ip=" + UserIP + "&format=xml"给出了一个可解析的 xml 结果。

于 2013-08-16T06:32:55.100 回答
1

这是我要做的:

  • 使用 HTTP 传输,查询站点并缓冲结果
  • 将其转换为字符串
  • 在其上使用拆分算法将其制成数组。
  • 检查数组的第 0 个元素是否等于“OK”
  • 如果没有,请保释。
  • 如果是这样,请分别检查第三个和第四个元素的国家代码和国家名称。
于 2013-08-16T06:21:18.440 回答