Следуя некоторым ранее полезным советам по XML, у меня возникла небольшая проблема с ответами Amazon MWS.
В ответе иногда нет данных для внутренних узлов, например:
<GetMyPriceForASINResult ASIN="B0713SH24R" status="Success">
<Product>
<Identifiers>
<MarketplaceASIN>
<MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
<ASIN>B0713SH24R</ASIN>
</MarketplaceASIN>
</Identifiers>
<Offers>
<Offer>
<BuyingPrice>
<LandedPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>7.70</Amount>
</LandedPrice>
<ListingPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>7.70</Amount>
</ListingPrice>
<Shipping>
<CurrencyCode>USD</CurrencyCode>
<Amount>0.00</Amount>
</Shipping>
</BuyingPrice>
<RegularPrice>
<CurrencyCode>USD</CurrencyCode>
<Amount>13.99</Amount>
</RegularPrice>
<FulfillmentChannel>AMAZON</FulfillmentChannel>
<ItemCondition>New</ItemCondition>
<ItemSubCondition>New</ItemSubCondition>
<SellerId>A2G0HWSQG6JL91</SellerId>
<SellerSKU>3 Paper Sm - Lined Cream</SellerSKU>
</Offer>
</Offers>
</Product>
</GetMyPriceForASINResult>
<GetMyPriceForASINResult ASIN="B07GFN1N8Q" status="Success">
<Product>
<Identifiers>
<MarketplaceASIN>
<MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
<ASIN>B07GFN1N8Q</ASIN>
</MarketplaceASIN>
</Identifiers>
<Offers/>
</Product>
</GetMyPriceForASINResult>
<GetMyPriceForASINResult ASIN="B01NAU635T" status="Success">
<Product>
<Identifiers>
<MarketplaceASIN>
<MarketplaceId>ATVPDKIKX0DER</MarketplaceId>
Второй ASIN "B07GFN1N8Q" не имеет значений для CurrencyCode и т. Д. Я должен проверить, что они отсутствуют, чтобы использовать xpath для хранения всех других данных в массивах.
Однако, поскольку я заполняю «массив ASIN», то, например, «массив CurrencyCode», используя xpath, тот факт, что в некоторых ASIN отсутствуют данные, массивы не «выстраиваются» (содержат одинаковое количество результатов).
Поэтому мне нужно проверить, если в дереве ASIN отсутствует CurrencyCode и т. Д., Тогда я могу поместить 0 или что-то в массив CurrencyCode в качестве заполнителя.
Код, помещающий данные в массивы, выглядит так:
$namespaces = $doc->getNamespaces(true);
$nsDoc = $doc->children($namespaces['']);
$nsDoc->registerXPathNamespace('p', 'http://mws.amazonservices.com/schema/Products/2011-10-01');
$nodesASIN = $nsDoc->xpath('//p:GetMyPriceForASINResult/p:Product/p:Identifiers/p:MarketplaceASIN/p:ASIN');
foreach ($nodesASIN as $node)
{
$asin_array[] = (string) ($node);
}
$nodesCurrencyCode = $nsDoc->xpath('//p:GetMyPriceForASINResult/p:Product/p:Offers/p:Offer/p:BuyingPrice/p:LandedPrice/p:CurrencyCode');
foreach ($nodesCurrencyCode as $node)
{
$CurrencyCode_array[] = (string) ($node);
}
Но это циклически перебирает все ASIN, а затем перебирает все коды валют. Мне нужно проверить конкретный код валюты, который имеет отношение к конкретному ASIN.