1

我想解析 google geocode api 响应,但结果的结构并不总是相同的。例如,我需要知道邮政编码,但它有时在Locality/DependentLocality/PostalCode/PostalCodeNumber节点中,有时在Locality/PostalCode/PostalCodeNumber节点中。我真的不知道这背后的逻辑,只想获取PostalCodeNumber节点的值,不管它到底在哪里。我可以用 XPath 做吗?如果是这样,怎么做?

更新

尝试过,//PostalCodeNumber但它返回一个空数组。代码片段如下:

$xml = new \SimpleXMLElement($response);
var_dump($xml->xpath('//PostalCodeNumber'));

$responsehttp://maps.google.com/maps/geo?q=1055+Budapest&output=xml的内容 (复制粘贴网址而不是点击它,因为一些字符问题...)

4

2 回答 2

2

尝试使用这个 XPath:

Locality//PostalCodeNumber

它将找到元素的所有后代PostalCodeNumberLocality

于 2012-11-06T00:28:03.050 回答
1
//PostalCode/PostalCodeNumber

应该做的伎俩。快速谷歌搜索产生以下架构片段,表明可能存在多个嵌套的 DependentLocality 元素,因此您需要检查多个结果,并了解您是否想要最具体(嵌套最深)或最少具体的。

更新: 为了防止命名空间问题,将命名空间显式添加到查询中:

$xml = new SimpleXMLElement($response);
$xpath->registerXPathNamespace('ns', 'urn:oasis:names:tc:ciq:xsdschema:xAL:2.0');
var_dump($xml->xpath('//ns:PostalCodeNumber'));

更新 2:修正了几个错别字

更新 3:

 <?php 
$result = file_get_contents('http://maps.google.com/maps/geo?q=1055+Budapest&output=xml');
$sxe = new SimpleXMLElement($result);
$sxe->registerXPathNamespace('c', 'urn:oasis:names:tc:ciq:xsdschema:xAL:2.0');
$search = $sxe->xpath('//c:PostalCodeNumber');
foreach($search as $code) {
  echo $code;
}
?> 
于 2012-11-06T00:36:25.423 回答