2012-10-06 55 views
1

可能重複:
Xpath fails if an element has a a xmlns attribute的XPath不正確的查詢路徑

我一直在努力了很長時間來提取下面的XML字符串,沒有運氣 http://chris.photobooks.com/xml/default.htm?state=8T

我正在嘗試獲取一本書的ASIN號碼,我試過

$xpath->query('//MarketplaceASIN/ASIN')->item(0)->nodeValue; 

$xpath->query('/GetMatchingProductResponse/GetMatchingProductResult[1]/Product/Identifiers/MarketplaceASIN/ASIN')->item(0)->nodeValue; 

但既不似乎工作,我究竟做錯了什麼?

回答

1

該文檔中的元素綁定到名稱空間http://mws.amazonservices.com/schema/Products/2011-10-01

您可能錯過了它,因爲它不使用名稱空間前綴,並且xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01"看起來像一個屬性,但名稱空間屬性是特殊的。

所有後代元素都繼承該名稱空間。您將要註冊一個命名空間前綴的命名空間和調整的XPath:

$rootNamespace = $xml->lookupNamespaceUri($xml->namespaceURI); 
$xpath->registerNamespace('a', $rootNamespace); 
$elementList = $xpath->query('//a:MarketplaceASIN/a:ASIN'); 

或者你可以使用的元素相匹配,並使用謂詞濾鏡來適應local-name()namespace-uri()一個更通用的XPath :

//*[local-name()='MarketplaceASIN' and namespace-uri()='http://mws.amazonservices.com/schema/Products/2011-10-01']/*[local-name()='ASIN' and namespace-uri()='http://mws.amazonservices.com/schema/Products/2011-10-01'] 
+1

非常感謝你,那5個小時的睡眠我不會回來 –