我想解析谷歌地理编码api响应,但结果的结构并不总是一样的。我需要知道邮政编码,例如,它有时在Locality/DependentLocality/PostalCode/PostalCodeNumber
节点,有时在Locality/PostalCode/PostalCodeNumber
节点。我真的不知道这背后的逻辑,只想获得PostalCodeNumber
节点的值,无论它究竟在哪里。我可以用XPath做到吗?如果是这样,怎么样?
更新
尝试使用//PostalCodeNumber
,但它返回一个空数组。代码段如下:
$xml = new \SimpleXMLElement($response);
var_dump($xml->xpath('//PostalCodeNumber'));
$response
是http://maps.google.com/maps/geo?q=1055+Budapest&output=xml的内容
(复制粘贴网址而不是因为某些字符问题而点击它...)
答案 0 :(得分:2)
尝试使用此XPath:
Locality//PostalCodeNumber
它会找到PostalCodeNumber
元素的所有后代Locality
。
答案 1 :(得分:1)
//PostalCode/PostalCodeNumber
应该做的伎俩。快速谷歌搜索产生以下schema snippet,表明可能有多个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;
}
?>