Reputation: 3991
I want to get the data between the <lat>
and <lng>
tags in the following XML:
<viewport>
<southwest>
<lat>41.7450495</lat>
<lng>-87.8859170</lng>
</southwest>
</viewport>
which is part of a bigger XML:
<?xml version="1.0" encoding="UTF-8"?>
<GeocodeResponse>
<status>OK</status>
<result>
<type>locality</type>
<type>political</type>
<formatted_address>Chicago, IL, USA</formatted_address>
<address_component>
<long_name>Chicago</long_name>
<short_name>Chicago</short_name>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Cook</long_name>
<short_name>Cook</short_name>
<type>administrative_area_level_2</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Illinois</long_name>
<short_name>IL</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
<address_component>
<long_name>United States</long_name>
<short_name>US</short_name>
<type>country</type>
<type>political</type>
</address_component>
<geometry>
<location>
<lat>41.8781136</lat>
<lng>-87.6297982</lng>
</location>
<location_type>APPROXIMATE</location_type>
<viewport>
<southwest>
<lat>41.7450495</lat>
<lng>-87.8859170</lng>
</southwest>
<northeast>
<lat>42.0109012</lat>
<lng>-87.3736794</lng>
</northeast>
</viewport>
<bounds>
<southwest>
<lat>41.6443350</lat>
<lng>-87.9402669</lng>
</southwest>
<northeast>
<lat>42.0231310</lat>
<lng>-87.5236609</lng>
</northeast>
</bounds>
</geometry>
</result>
</GeocodeResponse>
Right now, I'm trying to use this code to parse it:
string url = "http://maps.googleapis.com/maps/api/geocode/xml?address="+address+"&sensor=false";
WebClient client = new WebClient();
string result = client.DownloadString(url);
var element = XElement.Parse(result);
var lat = (double)element.Element("lat");
var lng = (double)element.Element("lng");
but it isn't working, element is null
. How can I do this?
Upvotes: 2
Views: 5087
Reputation: 3991
The below code works fine....
WebClient client = new WebClient();
string result = client.DownloadString(url);
var element = XElement.Parse(result);
var lat = element.Descendants("lat").First();
var lng = element.Descendants("lng").First();
Upvotes: 1
Reputation: 134521
Don't use a regular expression, parse it. This uses LINQ to XML.
This should work for you:
var doc = XDocument.Parse(result);
var sw = doc.Descendants("viewport").Elements("southwest").SingleOrDefault();
if (sw != null)
{
var lat = (double)sw.Element("lat");
var lng = (double)sw.Element("lng");
// do stuff
}
Upvotes: 5
Reputation: 32439
Use
.*<lat>([^<]*)</lat>.*<lng>([^<]*)</lng>.*
with DOTALL (s) flag and the capturing groups return the latitude and longitude.
Upvotes: 3