从免费地理位置服务中读取XML元素

时间:2013-06-06 13:38:31

标签: xml vb.net linq

This是获取IP地址的地理位置的免费服务。

我已经构建了一个类函数来获取xml响应。这是代码。

    Public Shared Function GetGeoLocation(ByVal IpAddress As String) As String    
        Using client = New WebClient()
            Try
                Dim strFile = client.DownloadString(String.Format("http://freegeoip.net/xml/{0}", IpAddress))

                Dim xml As XDocument = XDocument.Parse(strFile)
                Dim responses = From response In xml.Descendants("Response")
                                Select New With {response.Element("CountryName").Value}
                                Take 1

                Return responses.ElementAt(0).ToString()
            Catch ex As Exception
                Return "Default"
            End Try
        End Using
    End Function

请求请求我没有遇到任何问题。问题是从服务中读取返回请求。例如,IP地址180.73.24.99将返回此值:

<Response>
<Ip>180.73.24.99</Ip>
<CountryCode>MY</CountryCode>
<CountryName>Malaysia</CountryName>
<RegionCode>01</RegionCode>
<RegionName>Johor</RegionName>
<City>Tebrau</City><ZipCode/>
<Latitude>1.532</Latitude>
<Longitude>103.7549</Longitude>
<MetroCode/>
<AreaCode/>
</Response>

我的函数GetGeoLocation(180.73.24.99)将返回{ Value = Malaysia }。如何修复此功能只返回Malaysia。我想我的linq声明有问题。

解决方案

Dim responses = From response In xml.Descendants("Response")
                Select response.Element("CountryName").Value

1 个答案:

答案 0 :(得分:1)

而不是返回此Select New With {response.Element("CountryName").Value}匿名对象,只需返回CountryName元素的值:

Select response.Element("CountryName").Value

另外,我建议你使用FirstOrDefault代替第一项。

Dim xdoc = XDocument.Parse(strFile)
Dim countries = From r In xdoc...<Response>
                Select r.<CountryName>.Value
Return If(countries.FirstOrDefault(), "Default")

甚至在一行

Return If(xdoc...<Response>.<CountryName>.FirstOrDefault(), "Default")