获取空数组试图用属性解析xml

时间:2012-08-30 18:44:48

标签: php xml xpath xml-parsing

我正在尝试使用属性解析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时返回一个空数组。 我如何解决这个问题以获取我需要的信息? 我可以上传任何有助于解决此问题的代码片段。

1 个答案:

答案 0 :(得分:1)

这里有(至少)两个不同的问题。

XPath

您的XPath OfferListingCount[@condition="Any"]只会返回匹配的<OfferListingCount>元素,这些元素是$priceComp_xml中保存的元素的子元素。它不会与作为孙子的后代元素匹配,也不会与树下的元素相匹配。

因此,需要修改它以匹配<OfferListingCount>元素。快速修复通常使用简写///descendant-or-self::node()/的缩写),例如//OfferListingCount[@condition="Any"]

命名空间

你的问题没有提到这一点,但是有些挖掘发现XML文档可能有一个默认的命名空间。通过查看xmlns="…"的文档元素可以识别这一点。使用XPath时,此命名空间必须为registered并在查询时使用。

$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];