1

これは、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
4

1 に答える 1

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")

または1行でも

Return If(xdoc...<Response>.<CountryName>.FirstOrDefault(), "Default")
于 2013-06-06T13:51:45.627 に答える