XPath不正确的查询路径

时间:2012-10-06 03:18:27

标签: php xml xpath

  

可能重复:
  Xpath fails if an element has a a xmlns attribute

我已经尝试了很长时间从以下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 个答案:

答案 0 :(得分:1)

该文档中的元素绑定到命名空间http://mws.amazonservices.com/schema/Products/2011-10-01

您可能错过了它,因为它不使用名称空间前缀,xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01"看起来像属性,但名称空间属性是特殊的。

所有后代元素都继承该命名空间。您将需要使用namespace-prefix注册命名空间并调整XPath:

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

或者您可以使用与元素匹配的更通用的XPath,并使用谓词过滤器来匹配local-name()namespace-uri()

//*[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']