从 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><span class="street-address">1805 Geary Boulevard</span>, <span class="locality">San Francisco</span>, <span class="region">CA</span> <span class="postal-code">94115</span>, <span class="country-name">United States</span></adr_address>
我将 adr_address xElement 放入此处的一个对象中,但不确定之后如何获取每个 class 的值。
XElement firstOrDefault = xElement.Descendants("adr_address").FirstOrDefault();
我觉得很奇怪,您会以这种形式获得地址、邮政编码等值。通常 Google 地图应该正确解析这些值。
无论如何,你可以做的就是像这样取消转义特殊字符:
firstOrDefault.Value.Replace("<", "<").Replace(">", ">");
然后使用此正则表达式提取值:
var str = "<span class=\"street-address\">1805 Geary Boulevard</span>, <span class=\"locality\">San Francisco</span>, <span class=\"region\">CA</span> <span class=\"postal-code\">94115</span>, <span class=\"country-name\">United States</span>".Replace("<", "<").Replace(">", ">");
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()
我从 google 地图中提取了一些地址,它们在 xml 文件中。 在我的 xml 文件中,我有一些像
这样的 xelements<location>, <place_id>, <adr_address>, etc
'adr_address' 元素有不同的 class 元素,每个 class 包含城市、街道、国家/地区等值。如何从 'adr_address' xElement
中获取每个值<adr_address><span class="street-address">1805 Geary Boulevard</span>, <span class="locality">San Francisco</span>, <span class="region">CA</span> <span class="postal-code">94115</span>, <span class="country-name">United States</span></adr_address>
我将 adr_address xElement 放入此处的一个对象中,但不确定之后如何获取每个 class 的值。
XElement firstOrDefault = xElement.Descendants("adr_address").FirstOrDefault();
我觉得很奇怪,您会以这种形式获得地址、邮政编码等值。通常 Google 地图应该正确解析这些值。
无论如何,你可以做的就是像这样取消转义特殊字符:
firstOrDefault.Value.Replace("<", "<").Replace(">", ">");
然后使用此正则表达式提取值:
var str = "<span class=\"street-address\">1805 Geary Boulevard</span>, <span class=\"locality\">San Francisco</span>, <span class=\"region\">CA</span> <span class=\"postal-code\">94115</span>, <span class=\"country-name\">United States</span>".Replace("<", "<").Replace(">", ">");
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()