1

可能重复:
如果元素具有 xmlns 属性,则 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;

但似乎都不起作用,我在这里做错了什么?

4

1 回答 1

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');

或者,您可以使用更通用的 XPath 来匹配元素并使用谓词过滤器来匹配local-name()and 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']
于 2012-10-06T03:41:16.707 回答