我正在尝试使用属性解析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时返回一个空数组。 我如何解决这个问题以获取我需要的信息? 我可以上传任何有助于解决此问题的代码片段。
答案 0 :(得分:1)
这里有(至少)两个不同的问题。
您的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];