使用xpath查找节点

时间:2012-11-06 00:21:30

标签: php xml xpath find

我想解析谷歌地理编码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的内容 (复制粘贴网址而不是因为某些字符问题而点击它...)

2 个答案:

答案 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;
}
?>