2012-11-06 144 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