Найти, если вложенные узлы XML отсутствуют в некоторых внешних узлах - PullRequest
0 голосов
/ 05 сентября 2018

Следуя некоторым ранее полезным советам по 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.

...