2016-09-20 2 views
9

Данные:Как вы разбираете отношения в MWS GetMatchingProduct?

<Relationships> 
     <ns2:VariationChild> 
     <Identifiers> 
      <MarketplaceASIN> 
      <MarketplaceId>ATVPDKIKX0DER</MarketplaceId> 
      <ASIN>B002KT3XQC</ASIN> 
      </MarketplaceASIN> 
     </Identifiers> 
     <ns2:Color>Black</ns2:Color> 
     <ns2:Size>Small</ns2:Size> 
     </ns2:VariationChild> 
     <ns2:VariationChild> 
     <Identifiers> 
      <MarketplaceASIN> 
      <MarketplaceId>ATVPDKIKX0DER</MarketplaceId> 
      <ASIN>B002KT3XQW</ASIN> 
      </MarketplaceASIN> 
     </Identifiers> 
     <ns2:Color>Black</ns2:Color> 
     <ns2:Size>Medium</ns2:Size> 
     </ns2:VariationChild> 
</Relationships> 

Кодекс:

$data = simplexml_load_string($response); 
foreach($data->GetMatchingProductResult AS $GetMatchingProductResult){ 
    $Product = $GetMatchingProductResult->Product; 
    $Relationships = $Product->Relationships; 

    foreach($Relationships->children('ns2', true)->VariationChild AS $VariationChild){ 

      $Identifiers = $VariationChild->Identifiers; 
       $MarketplaceASIN = $Identifiers->MarketplaceASIN; 
        $MarketplaceId = $MarketplaceASIN->MarketplaceId; 
        $ASIN = $MarketplaceASIN->ASIN; 

        echo "$ASIN<br />"; 

    } 
} 

Это вторит возвращается, но никаких данных, так что на самом деле перекручивание через XML. Однако ничего, что я попробую, фактически вернет данные в переменную $ ASIN. Это из-за пространства имен или simpleXML, или я вообще что-то пропустил?

редактировать: другие методы не пытались

foreach($Relationships->children('http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd', true)->VariationChild AS $VariationChild){ 

    $Identifiers   = $VariationChild->Identifiers; 
      $MarketplaceASIN = $Identifiers->MarketplaceASIN; 
       $MarketplaceId = $MarketplaceASIN->MarketplaceId; 
       $ASIN   = $MarketplaceASIN->ASIN; 

       echo "[$ASIN]<br />"; 

} 

$test = new SimpleXMLElement($response); 
$test->registerXPathNamespace('ns2', 'http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd'); 
$variations = $test->xpath('//ns2:VariationChild'); 

foreach($variations AS $vars){ 

    print_r($vars); 

} 

Ни кажется, даже цикл данных.

ответ

6

Следующий код извлекает ASIN строки:

$data = simplexml_load_string($response); 

foreach ($data->GetMatchingProductResult as $GetMatchingProductResult) { 
    $Product = $GetMatchingProductResult->Product; 
    $Relationships = $Product->Relationships; 

    foreach ($Relationships->children('ns2', true)->VariationChild 
    as $VariationChild) 
    { 
    foreach ($VariationChild->children('', true) as $var_child) { 
     echo $var_child->MarketplaceASIN->ASIN, PHP_EOL; 
    } 
    } 
} 

Стоит отметить, то real response format отличается от того, что вы выложили.

2

Да, это пространство имен используется неправильно. Замените «ns2» в вашем коде полным пространством имен «http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd».

Лучшее решение imo должно использовать registerXPathNamespace, а затем использовать xpath для доступа к дочерним элементам.

+0

Спасибо! К сожалению, ни один из методов не работал для меня. Я разместил редактирование выше, но похоже, что он даже не зацикливает данные. – fwho

Смежные вопросы