Получить данные между тегами в XML-файле - PullRequest
2 голосов
/ 07 июня 2011

Я хочу получить данные между тегами <lat> и <lng> в следующем XML:

<viewport>
 <southwest>
  <lat>41.7450495</lat>
  <lng>-87.8859170</lng>
 </southwest>
</viewport>

, который является частью большего 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>

Сейчас я пытаюсь использовать этот код для его анализа:

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

но это не работает, элемент null. Как я могу это сделать?

Ответы [ 3 ]

5 голосов
/ 07 июня 2011

Не используйте регулярные выражения, анализируйте их. Это использует LINQ to XML.

Это должно работать для вас:

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
}
3 голосов
/ 07 июня 2011

Используйте

.*<lat>([^<]*)</lat>.*<lng>([^<]*)</lng>.*

с флагом DOTALL (s) и группы захвата возвращают широту и долготу.

1 голос
/ 07 июня 2011

Код ниже работает нормально ....

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...