2012-11-06 224 views
1

我想解析google地理编码API响应,但结果的结构并不总是相同的。例如,我需要知道邮政编码,但有时位于Locality/DependentLocality/PostalCode/PostalCodeNumber节点,有时位于Locality/PostalCode/PostalCodeNumber节点。我不知道这背后的逻辑,只是想知道节点的价值,不管它在哪里。我可以使用XPath来完成吗?如果是这样,怎么样?用xpath查找节点

UPDATE

试图与//PostalCodeNumber但它返回一个空数组。的代码片段如下:

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

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

回答

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; 
} 
?> 
+0

它返回一个空数组。 :( – haxpanel

+0

我怀疑命名空间问题...尝试添加$ xpath-> registerNamespace('ns',“urn:oasis:names:tc:ciq:xsdschema:xAL:2.0”); – Gus

+0

无效$ dom = new \ DOMDocument; $ dom-> loadXML($ xml-> AddressDetails-> asXML()); $ xpath = new \ DomXpath($ dom); $ xpath-> registerNamespace('ns',“urn: Oasis:names:tc:ciq:xsdschema:xAL:2.0“); var_dump($ xpath-> query('// PostalCodeNumber'));' – haxpanel

2

尝试使用这个XPath :

Locality//PostalCodeNumber 

它会找到所有后代Locality元素PostalCodeNumber

+0

对不起,我没有提到'Locality'节点不是根。我尝试使用根节点和Locality节点中的// PostalCodeNumber,但是返回数组(0)。 – haxpanel

+0

@haxpanel,'// PostalCodeNumber'应该返回所有'PostalCodeNumber'元素。看来你的XPath引擎不能正常工作。 –

+0

好的,谢谢!我应该为这个XPath引擎问题开一个新主题吗? – haxpanel