【问题标题】:Getting address data from Google Maps XML从 Google Maps XML 获取地址数据
【发布时间】:2018-07-12 23:17:41
【问题描述】:

我从谷歌地图中提取了一些地址,它们位于一个 xml 文件中。 在 myxml 文件中,我有一些 xelements,例如

<location>, <place_id>, <adr_address>, etc

“adr_address”元素有不同的类,每个类包含城市、街道、国家等值。如何从“adr_address”xElement 中获取每个值

<adr_address>&lt;span class="street-address"&gt;1805 Geary Boulevard&lt;/span&gt;, &lt;span class="locality"&gt;San Francisco&lt;/span&gt;, &lt;span class="region"&gt;CA&lt;/span&gt; &lt;span class="postal-code"&gt;94115&lt;/span&gt;, &lt;span class="country-name"&gt;United States&lt;/span&gt;</adr_address>

我在这里将 adr_address xElement 放入一个对象中,但不确定之后如何获取每个类的值。

XElement firstOrDefault = xElement.Descendants("adr_address").FirstOrDefault();

【问题讨论】:

  • 我不知道为什么,但 Google 地图在 adr_address 元素中返回了一些 HTML。它根本不是 XML。其中,这些是 HTML 意义上的“类”,而不是编程语言意义上的“类”。如果您现在不使用 HTML,那么您可能不明白在这种情况下“类”是什么意思。

标签: c# xml xelement


【解决方案1】:

在我看来,您以这种形式获得地址、邮政编码等值似乎很奇怪。通常谷歌地图应该正确解析这些值。

无论如何,您可以做的是像这样取消转义特殊字符:

firstOrDefault.Value.Replace("&lt;", "<").Replace("&gt;", ">");  

然后使用这个正则表达式来提取值:

 var str = "&lt;span class=\"street-address\"&gt;1805 Geary Boulevard&lt;/span&gt;, &lt;span class=\"locality\"&gt;San Francisco&lt;/span&gt;, &lt;span class=\"region\"&gt;CA&lt;/span&gt; &lt;span class=\"postal-code\"&gt;94115&lt;/span&gt;, &lt;span class=\"country-name\"&gt;United States&lt;/span&gt;".Replace("&lt;", "<").Replace("&gt;", ">");

        Regex regex = new Regex("<span class=\"street-address\">(.*)</span>, <span class=\"locality\">(.*)</span>, <span class=\"region\">(.*)</span> <span class=\"postal-code\">(.*)</span>, <span class=\"country-name\">(.*)</span>");
        Match match = regex.Match(str);

        if (match.Success)
        {
            string address = match.Groups[1].Value;
            string locality = match.Groups[2].Value;
            string region = match.Groups[3].Value;
            string zip = match.Groups[4].Value;
            string country = match.Groups[5].Value;
         }

【讨论】:

  • 糟糕,糟糕,糟糕。建议 Regex 解析 HTML,甚至不向 OP 说明 Google 已向他返回了一些 HTML 而不是 XML。
  • 我注意到它是 HTML 格式的 .. 您是否尝试编写代码来解析此处发布的 HTML?它是用逗号分隔的跨度。在我看来不干净。一个简单的正则表达式对我来说似乎更容易解释这一点。我同意从长远来看它可能不太稳定。但这一切都取决于数据来自何处以及如何变化。我让你发布 jour 代码来比较:)
  • 最好的办法是首先正确地存储数据,或者找出为什么它会以这种形式出现。我很确定它不是直接来自 google maps api
  • 一般来说,正则表达式不适用于 HTML。如果 OP 正在调用 Google Maps 并取回此信息,那么 Google Maps 出于某种原因将其发回。现在,是的,也许 OP 实际上将这些信息 发送 到 Google 地图(我不知道他们的 API),但无论如何,它是 HTML,不应该用正则表达式解析。
  • 另一篇文章没有说“用于大型数据集”。它表示HTML不是“regular language”,所以一般情况下,不能被正则表达式解析或匹配。
【解决方案2】:

接受的答案是错误的,adr_address 没有记录在案,我们不能依赖它,您必须使用 address_components,它是一个数组,所有信息都已拆分并带有类型标识符 (here is a list for them):

var addrComponents =  xElement.Descendants("address_component");
foreach(var component in addrComponents)
{
   if(component.Descendants('type').Any(t => t.Value == "country"))
       country = component.long_name;
   else if (....)
       ....
}

由于每个组件可能有多个类型,您必须在其所有类型中进行搜索,这就是我使用Any 的原因。

对不起,如果这没有编译,因为我直接在这里写了这个,但这是主要思想。

【讨论】:

    【解决方案3】:

    这行得通(经过试验和测试):)

    // load xml string from webresponse into the linq functionality library .
    var elements = XElement.Load(XmlReader.Create(new StringReader(xml)));
    
    // get all the address_component elements in the xml
    var addrComponents = elements.Descendants("address_component");
    
    // under those: get all the one's that contain element "type"
    var country = addrComponents.Where(d => d.Descendants("type")
    
    // filter further to get the one's with country in their value.(ie. 
    //<type>country</type>)
    .Any(t => t.Value == "country"))
    
    //first one that matches these criteria, take the long_name value ie 
    //<long_name>'merica</long_name> this could be subbed for short_name as well 
    //for country code
    .First().Element("long_name").Value;
    

    全部完成:)

    【讨论】:

    • 请解释您的代码行,以便其他用户了解其功能。谢谢!
    【解决方案4】:

    如果你不介意使用 jQuery,这对我来说非常有用:

    var street_address = $("<p>" + place.adr_address + "</p>").find(".street-address").html()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 2017-04-02
      相关资源
      最近更新 更多