2011-06-07 100 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(); 
相关问题