0

我正在尝试解析带有属性的 xml 文件,并不断得到一个空数组。这是 xml 的示例,它被解析为 simplexml_load_string:

     <NumberOfOfferListings>
    <OfferListingCount condition="Any">61</OfferListingCount>
    <OfferListingCount condition="Used">45</OfferListingCount>
    <OfferListingCount condition="New">16</OfferListingCount>
  </NumberOfOfferListings>

这是我正在使用的 php 代码

$priceComp_xml = amazonCompPrice_xml($asin);
$compPricing = $priceComp_xml->xpath('OfferListingCount[@condition="Any"]'); 

amazonCompPrice($asin) 是根据 ASIN 值解析的 xml 文件。

我只需要提取:

<OfferListingCount condition="Any">61</OfferListingCount>

为了达到这一点,我查看了这里的许多示例,看起来我所拥有的是正确的,当我使用 print_r($compPricing) 或 var_dump 时,它只返回一个空数组。我该如何解决这个问题以获得我需要的信息?我可以上传更多有助于解决此问题的代码片段。

4

1 回答 1

1

这里(至少)有两个不同的问题在起作用。

XPath

您的 XPath, OfferListingCount[@condition="Any"], 只会返回匹配<OfferListingCount>的元素,这些元素是$priceComp_xml. 它不会匹配作为孙子的后代元素,或者更远的树。

因此,需要对其进行修改以匹配<OfferListingCount>元素。通常使用速记//(的缩写/descendant-or-self::node()/)的快速解决方法,例如//OfferListingCount[@condition="Any"].

命名空间

您的问题没有提到这一点,但一些挖掘发现 XML 文档可能应用了默认命名空间。这可以通过查看 的文档元素来识别xmlns="…"。使用XPath时,需要注册这个命名空间,查询时使用。

$priceComp_xml->registerXPathNamespace('products', 'http://mws.amazonservices.com/schema/Products/2011-10-01');
$compPricing = $priceComp_xml->xpath('//products:OfferListingCount[@condition="Any"]');

最后,请记住它SimpleXMLElement::xpath()返回一个数组,因此您的匹配<offerListingCount>元素将作为$compPricing[0].

$count = (int) $compPricing[0];
于 2012-08-30T19:01:50.743 回答