SimpleXML检查存在SimpleXML对象

时间:2012-08-13 18:03:52

标签: php xml simplexml

我正在使用if语句来检查XML对象是否存在,但是当我得到trying to get property of non-object error

时它不能正常工作

下面是代码

foreach($resp->GetLowestOfferListingsForASINResult as $product){
   $isbn = "";
   $price = "";
   $condition = "";

   if($product->Product->Identifiers->MarketplaceASIN->ASIN){
      $isbn = (string) $product->Product->Identifiers->MarketplaceASIN->ASIN;
   }

   if($product->Product->LowestOfferListings->LowestOfferListing->Price->LandedPrice->Amount){
      $price = (float) $product->Product->LowestOfferListings->LowestOfferListing->Price->LandedPrice->Amount;
   }

   if($product->Product->LowestOfferListings->LowestOfferListing->Qualifiers->ItemSubcondition){
      $condition = (string) $product->Product->LowestOfferListings->LowestOfferListing->Qualifiers->ItemSubcondition;
   }
}

我尝试过使用

if(!property_exists($product, 'Amount')){
   $price = (float) $product->Product->LowestOfferListings->LowestOfferListing->Price->LandedPrice->Amount;
}

但这不起作用,我应该使用什么

xml返回结果(如果价格存在)

<?xml version="1.0"?>
<GetLowestOfferListingsForASINResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
<GetLowestOfferListingsForASINResult ASIN="000726965X" status="Success">
  <AllOfferListingsConsidered>true</AllOfferListingsConsidered>
  <Product xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
    <Identifiers>
      <MarketplaceASIN>
        <MarketplaceId>A1F83G8C2ARO7P</MarketplaceId>
        <ASIN>000726965X</ASIN>
      </MarketplaceASIN>
    </Identifiers>
    <LowestOfferListings>
      <LowestOfferListing>
        <Qualifiers>
          <ItemCondition>Used</ItemCondition>
          <ItemSubcondition>Mint</ItemSubcondition>
          <FulfillmentChannel>Amazon</FulfillmentChannel>
          <ShipsDomestically>True</ShipsDomestically>
          <ShippingTime>
            <Max>0-2 days</Max>
          </ShippingTime>
          <SellerPositiveFeedbackRating>95-97%</SellerPositiveFeedbackRating>
        </Qualifiers>
        <NumberOfOfferListingsConsidered>1</NumberOfOfferListingsConsidered>
        <SellerFeedbackCount>500720</SellerFeedbackCount>
        <Price>
          <LandedPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>12.65</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>12.65</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>0.00</Amount>
          </Shipping>
        </Price>
        <MultipleOffersAtLowestPrice>False</MultipleOffersAtLowestPrice>
      </LowestOfferListing>
      <LowestOfferListing>
        <Qualifiers>
          <ItemCondition>Used</ItemCondition>
          <ItemSubcondition>Acceptable</ItemSubcondition>
          <FulfillmentChannel>Merchant</FulfillmentChannel>
          <ShipsDomestically>True</ShipsDomestically>
          <ShippingTime>
            <Max>0-2 days</Max>
          </ShippingTime>
          <SellerPositiveFeedbackRating>95-97%</SellerPositiveFeedbackRating>
        </Qualifiers>
        <NumberOfOfferListingsConsidered>1</NumberOfOfferListingsConsidered>
        <SellerFeedbackCount>73208</SellerFeedbackCount>
        <Price>
          <LandedPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>15.41</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>12.61</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>2.80</Amount>
          </Shipping>
        </Price>
        <MultipleOffersAtLowestPrice>False</MultipleOffersAtLowestPrice>
      </LowestOfferListing>
      <LowestOfferListing>
        <Qualifiers>
          <ItemCondition>Used</ItemCondition>
          <ItemSubcondition>Mint</ItemSubcondition>
          <FulfillmentChannel>Merchant</FulfillmentChannel>
          <ShipsDomestically>True</ShipsDomestically>
          <ShippingTime>
            <Max>0-2 days</Max>
          </ShippingTime>
          <SellerPositiveFeedbackRating>98-100%</SellerPositiveFeedbackRating>
        </Qualifiers>
        <NumberOfOfferListingsConsidered>1</NumberOfOfferListingsConsidered>
        <SellerFeedbackCount>2125</SellerFeedbackCount>
        <Price>
          <LandedPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>22.80</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>20.00</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>2.80</Amount>
          </Shipping>
        </Price>
        <MultipleOffersAtLowestPrice>False</MultipleOffersAtLowestPrice>
      </LowestOfferListing>
      <LowestOfferListing>
        <Qualifiers>
          <ItemCondition>Used</ItemCondition>
          <ItemSubcondition>Mint</ItemSubcondition>
          <FulfillmentChannel>Merchant</FulfillmentChannel>
          <ShipsDomestically>True</ShipsDomestically>
          <ShippingTime>
            <Max>0-2 days</Max>
          </ShippingTime>
          <SellerPositiveFeedbackRating>90-94%</SellerPositiveFeedbackRating>
        </Qualifiers>
        <NumberOfOfferListingsConsidered>1</NumberOfOfferListingsConsidered>
        <SellerFeedbackCount>68301</SellerFeedbackCount>
        <Price>
          <LandedPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>23.14</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>20.34</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>2.80</Amount>
          </Shipping>
        </Price>
        <MultipleOffersAtLowestPrice>False</MultipleOffersAtLowestPrice>
      </LowestOfferListing>
      <LowestOfferListing>
        <Qualifiers>
          <ItemCondition>Used</ItemCondition>
          <ItemSubcondition>Mint</ItemSubcondition>
          <FulfillmentChannel>Merchant</FulfillmentChannel>
          <ShipsDomestically>False</ShipsDomestically>
          <ShippingTime>
            <Max>0-2 days</Max>
          </ShippingTime>
          <SellerPositiveFeedbackRating>90-94%</SellerPositiveFeedbackRating>
        </Qualifiers>
        <NumberOfOfferListingsConsidered>2</NumberOfOfferListingsConsidered>
        <SellerFeedbackCount>4114</SellerFeedbackCount>
        <Price>
          <LandedPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>25.39</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>22.59</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>2.80</Amount>
          </Shipping>
        </Price>
        <MultipleOffersAtLowestPrice>False</MultipleOffersAtLowestPrice>
      </LowestOfferListing>
      <LowestOfferListing>
        <Qualifiers>
          <ItemCondition>Used</ItemCondition>
          <ItemSubcondition>Mint</ItemSubcondition>
          <FulfillmentChannel>Merchant</FulfillmentChannel>
          <ShipsDomestically>True</ShipsDomestically>
          <ShippingTime>
            <Max>0-2 days</Max>
          </ShippingTime>
          <SellerPositiveFeedbackRating>95-97%</SellerPositiveFeedbackRating>
        </Qualifiers>
        <NumberOfOfferListingsConsidered>1</NumberOfOfferListingsConsidered>
        <SellerFeedbackCount>34661</SellerFeedbackCount>
        <Price>
          <LandedPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>29.20</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>26.40</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>2.80</Amount>
          </Shipping>
        </Price>
        <MultipleOffersAtLowestPrice>False</MultipleOffersAtLowestPrice>
      </LowestOfferListing>
      <LowestOfferListing>
        <Qualifiers>
          <ItemCondition>Used</ItemCondition>
          <ItemSubcondition>VeryGood</ItemSubcondition>
          <FulfillmentChannel>Merchant</FulfillmentChannel>
          <ShipsDomestically>False</ShipsDomestically>
          <ShippingTime>
            <Max>0-2 days</Max>
          </ShippingTime>
          <SellerPositiveFeedbackRating>95-97%</SellerPositiveFeedbackRating>
        </Qualifiers>
        <NumberOfOfferListingsConsidered>1</NumberOfOfferListingsConsidered>
        <SellerFeedbackCount>49504</SellerFeedbackCount>
        <Price>
          <LandedPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>33.16</Amount>
          </LandedPrice>
          <ListingPrice>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>30.36</Amount>
          </ListingPrice>
          <Shipping>
            <CurrencyCode>GBP</CurrencyCode>
            <Amount>2.80</Amount>
          </Shipping>
        </Price>
        <MultipleOffersAtLowestPrice>False</MultipleOffersAtLowestPrice>
      </LowestOfferListing>
    </LowestOfferListings>
  </Product>
</GetLowestOfferListingsForASINResult>
<ResponseMetadata>
  <RequestId>09a1deae-94ec-4661-95ae-49567ab00eb8</RequestId>
</ResponseMetadata>
</GetLowestOfferListingsForASINResponse>

xml返回结果(如果价格不存在)

<?xml version="1.0"?>
<GetLowestOfferListingsForASINResponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01">
<GetLowestOfferListingsForASINResult ASIN="0957143826" status="Success">
  <AllOfferListingsConsidered>true</AllOfferListingsConsidered>
  <Product xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01" xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd">
    <Identifiers>
      <MarketplaceASIN>
        <MarketplaceId>A1F83G8C2ARO7P</MarketplaceId>
        <ASIN>0957143826</ASIN>
      </MarketplaceASIN>
    </Identifiers>
    <LowestOfferListings/>
  </Product>
</GetLowestOfferListingsForASINResult>
<ResponseMetadata>
  <RequestId>13918cb9-69e5-4445-ad24-70f6fda06f19</RequestId>
</ResponseMetadata>
</GetLowestOfferListingsForASINResponse>

1 个答案:

答案 0 :(得分:1)

您的问题是,您正在测试->运营商链中的距离太远:

if ( $product->Product->LowestOfferListings->LowestOfferListing->Price->LandedPrice->Amount )

为了测试这一点,PHP必须依次评估每个->运算符

  1. $product->Product [确定]
  2. $product->Product->LowestOfferListings [确定]
  3. $product->Product->LowestOfferListings->LowestOfferListing [如果没有价格,则为空集]
  4. $product->Product->LowestOfferListings->LowestOfferListing->Price [未定义]
  5. 在此之后,你已经太晚了。
  6. 此外,即使SimpleXML对象是空列表,它也不会计算为false,因此您需要使用isset。为了发现无价格情况,您需要这样:

    if ( isset($product->Product->LowestOfferListings->LowestOfferListing) )
    

    [注意:我实际上没有测试过上面的内容,所以我可能在某些特定方面出错了,但我很确定这是你的基本问题。]