0

属性を使用してxmlファイルを解析しようとしていますが、空の配列を取得し続けています。以下は、simplexml_load_stringとして解析されるxmlのサンプルです。

     <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

ここでは(少なくとも)2つの別々の問題が発生しています。

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 に答える