2011-06-07 4 views
2

Je veux obtenir les données entre les <lat> et <lng> balises dans le code XML suivant:Obtenir les données entre les balises dans un fichier xml

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

qui fait partie d'un XML plus:

<?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> 

En ce moment, je suis en train d'utiliser ce code pour l'analyser:

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

mais cela ne fonctionne pas, l'élément est null. Comment puis-je faire ceci?

+4

La réponse obligatoire à ce genre de questions: http://stackoverflow.com/questions/1732348/regex-match-open-tags-sauf-xhtml-self-contained-tags/1732454 # 1732454 –

+0

Pourquoi voulez-vous utiliser regex pour lire ce qui semble être du XML bien formé? –

+0

Etes-vous sûr que vous ne voulez pas quelque chose de plus sur la façon d'analyser un fichier xml? Quelque chose comme http://stackoverflow.com/questions/55828/best-practices-to-parse-xml-files? – baraboom

Répondre

5

Ne pas utiliser une expression régulière, l'analyser. Cela utilise LINQ to XML.

Cela devrait fonctionner pour vous:

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 
} 
+0

+1 pour un analyseur xml :) – naveen

+1

Pour aller encore plus "par le livre", vous pouvez utiliser XmlConvert.ToDouble au lieu de lancer. –

+0

'client WebClient = nouveau WebClient(); chaîne résultat = client.DownloadString (url); var element = XElement.Parse (résultat); var lat = (double) element.Element ("lat"); var lng = (double) element.Element ("lng"); ' Ceci est mon code. J'obtiens une erreur car la valeur ne peut pas être nulle pour 'élément'. le premier attribut de l'élément est null mais il lit le xml correctement. –

3

utilisation

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

avec DOTALL (s) flag et les groupes de capture retournent la latitude et de longitude.

+0

Malheureusement, la question ne concerne plus les expressions régulières. –

+0

Comme je ne connaissais pas l'analyse XML, j'ai demandé la solution dans une exression régulière. Mais cette exression régulière a bien fonctionné et m'a donné la solution exactement ce que je veux. merci hyperborée. –

+0

@karthik Heureux d'aider – Hyperboreus

1

Le code ci-dessous fonctionne très bien ....

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(); 
Questions connexes