【问题标题】:Get the data between tags in a xml file获取xml文件中标签之间的数据
【发布时间】:2011-06-07 05:27:14
【问题描述】:

我想在以下 XML 中获取 <lat><lng> 标记之间的数据:

<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。我该怎么做?

【问题讨论】:

  • 这类问题的必答题:stackoverflow.com/questions/1732348/…
  • 为什么要使用正则表达式来读取格式良好的 XML?
  • 您确定不想要更多关于如何解析 xml 文件的内容吗? stackoverflow.com/questions/55828/… 之类的东西?
  • @Gabi: bobince 真的很棒! :) @karthik:您无法使用正则表达式解析 [X]HTML。因为正则表达式无法解析 HTML。正则表达式不是可用于正确解析 HTML 的工具。您是否尝试过使用 XML 解析器?
  • @naveen。肯定的正则表达式(由于是规则的,因此是有限自动机的产物)不完整,因此不易于解析整个 XML 文件。然而,如果您只想在两个众所周知的标签之间摘录一些值,无论它们出现在哪里,正则表达式肯定会成功。显然你应该用 XML 解析器来解析 XML,但是 OP 的问题是合法的。

标签: c# xml xml-parsing


【解决方案1】:

不要使用正则表达式,解析它。这使用 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
}

【讨论】:

  • 要更“循规蹈矩”,您可以使用 XmlConvert.ToDouble 而不是强制转换。
  • 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"); 这是我的代码。我收到错误,因为“元素”的值不能为空。 element 的第一个属性为 null,但它正在正确读取 xml。
  • @karthik。通过编辑问题粘贴完整的正确 xml。
  • @naveen :问题中提供了完整的 xml。这里我想要任何一个 lat 和 lng 标记值。
  • @karthik:现在还不清楚你想要哪些元素。你想要viewport元素下的元素还是bounds元素下的元素?
【解决方案2】:

使用

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

带有 DOTALL (s) 标志,捕获组返回纬度和经度。

【讨论】:

  • 不幸的是,问题不再是关于正则表达式了。
  • 由于我不知道 XML 解析,所以我以正则表达式询问了解决方案。但是这种常规表达效果很好,并给了我想要的解决方案。谢谢 Hyperboreus。
【解决方案3】:

下面的代码可以正常工作......

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多