从 Google 地图 XML 获取地址数据

Getting address data from Google Maps XML

我从 google 地图中提取了一些地址,它们在 xml 文件中。 在我的 xml 文件中,我有一些像

这样的 xelements
<location>, <place_id>, <adr_address>, etc

'adr_address' 元素有不同的 class 元素,每个 class 包含城市、街道、国家/地区等值。如何从 '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 放入此处的一个对象中,但不确定之后如何获取每个 class 的值。

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

我觉得很奇怪,您会以这种形式获得地址、邮政编码等值。通常 Google 地图应该正确解析这些值。

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

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;
         }

接受的答案是错误的,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.

的原因

抱歉,如果这不能编译,因为我直接写在这里,但这是主要思想。

这有效(经过试验和测试):)

// 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;

全部完成:)

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

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