2011-06-07 88 views
2

我想在下面的XML的<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。我怎樣才能做到這一點?

+4

強制性回答這類問題:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2011-06-07 05:31:33

+0

爲什麼你想用正則表達式來讀取看起來是格式良好的XML? – 2011-06-07 05:32:59

+0

你確定你不想要更多的東西如何解析XML文件?像http://stackoverflow.com/questions/55828/best-practices-to-parse-xml-files? – baraboom 2011-06-07 05:34:19

回答

5

不要使用正則表達式,解析它。這使用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 
} 
+0

對於xml解析器來說是+1 :) – naveen 2011-06-07 05:38:01

+1

要更進一步「通過本書」,您可以使用XmlConvert.ToDouble來代替投射。 – 2011-06-07 05:38:46

+0

'WebClient client = new WebClient(); string result = client.DownloadString(url); var element = XElement.Parse(result); var lat =(double)element.Element(「lat」); (lng);' 這是我的代碼。因爲'元素'的值不能爲空,所以出現錯誤。元素的第一個屬性是null,但它正確地讀取了xml。 – 2011-06-07 05:59:58

3

使用

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

與DOTALL(S)標誌和捕獲組返回的經度和緯度。

+0

不幸的是,這個問題不再是正則表達式了。 – 2011-06-07 06:56:02

+0

因爲我不知道XML解析,所以我在正常的擴展中詢問了解決方案。但是這個正常的擴展工作得很好,給了我什麼我想要的解決方案。感謝Hyperboreus。 – 2011-06-07 07:03:23

+0

@karthik很高興幫助 – Hyperboreus 2011-06-07 07:07:26

1

下面的代碼工作正常....

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(); 
相關問題