2015-12-29 3 views
0

Я работаю над API Amazon, и когда я получаю ответ, он выглядит так.Ошибка при попытке получить данные XML

<GetMatchingProductForIdResult Id="082686322638" IdType="UPC" status="Success"> 
<Products> 
    <Product> 
    <Identifiers> 
     <MarketplaceASIN> 
     <MarketplaceId>ATVPDKIKX0DER</MarketplaceId> 
     <ASIN>B00TU53O8Q</ASIN> 
     </MarketplaceASIN> 
    </Identifiers> 
    <AttributeSets> 
     <ns2:ItemAttributes xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd" xml:lang="en-US"> 
     <ns2:Binding>Toy</ns2:Binding> 
     <ns2:Brand>Rubie's</ns2:Brand> 
     <ns2:Color>BLACK</ns2:Color> 
     <ns2:Department>unisex-child</ns2:Department> 
     <ns2:Feature>Half Helmet mask accessory covers face; one size fits most</ns2:Feature> 
     <ns2:Feature>Officially licensed Star Wars Episode VII costume accessory; as worn by Kylo Ren in Star Wars Episode VII: The Force Awakens</ns2:Feature> 
     <ns2:Feature>Helmet has faux battle damage representing a pivotal moment in the movie</ns2:Feature> 
     <ns2:Feature>Kylo Ren costumes and additional accessories available separately</ns2:Feature> 
     <ns2:Feature>Rubie's offers costumes and accessories from Star Wars original and prequel trilogies as well as the Clone Wars series; great group and family costume ideas</ns2:Feature> 
     <ns2:ItemDimensions> 
      <ns2:Height Units="inches">10.00</ns2:Height> 
      <ns2:Length Units="inches">10.00</ns2:Length> 
      <ns2:Width Units="inches">10.00</ns2:Width> 
      <ns2:Weight Units="pounds">0.13</ns2:Weight> 
     </ns2:ItemDimensions> 
     <ns2:IsAdultProduct>false</ns2:IsAdultProduct> 
     <ns2:Label>Rubies - Domestic</ns2:Label> 
     <ns2:ListPrice> 
      <ns2:Amount>9.99</ns2:Amount> 
      <ns2:CurrencyCode>USD</ns2:CurrencyCode> 
     </ns2:ListPrice> 
     <ns2:Manufacturer>Rubies - Domestic</ns2:Manufacturer> 
     <ns2:ManufacturerMaximumAge Units="months">120.0</ns2:ManufacturerMaximumAge> 
     <ns2:ManufacturerMinimumAge Units="months">60.0</ns2:ManufacturerMinimumAge> 
     <ns2:Model>32263</ns2:Model> 
     <ns2:NumberOfItems>1</ns2:NumberOfItems> 
     <ns2:PackageDimensions> 
      <ns2:Height Units="inches">4.00</ns2:Height> 
      <ns2:Length Units="inches">9.20</ns2:Length> 
      <ns2:Width Units="inches">8.20</ns2:Width> 
      <ns2:Weight Units="pounds">0.15</ns2:Weight> 
     </ns2:PackageDimensions> 
     <ns2:PackageQuantity>1</ns2:PackageQuantity> 
     <ns2:PartNumber>32263</ns2:PartNumber> 
     <ns2:ProductGroup>Toy</ns2:ProductGroup> 
     <ns2:ProductTypeName>TOYS_AND_GAMES</ns2:ProductTypeName> 
     <ns2:Publisher>Rubies - Domestic</ns2:Publisher> 
     <ns2:Size>One Size</ns2:Size> 
     <ns2:SmallImage> 
      <ns2:URL>http://ecx.images-amazon.com/images/I/41XuPVJMMkL._SL75_.jpg</ns2:URL> 
      <ns2:Height Units="pixels">75</ns2:Height> 
      <ns2:Width Units="pixels">66</ns2:Width> 
     </ns2:SmallImage> 
     <ns2:Studio>Rubies - Domestic</ns2:Studio> 
     <ns2:Title>Star Wars: The Force Awakens Child's Kylo Ren Half Helmet</ns2:Title> 
     <ns2:Warranty>No Warranty</ns2:Warranty> 
     </ns2:ItemAttributes> 
    </AttributeSets> 
    <Relationships/> 
    <SalesRankings> 
     <SalesRank> 
     <ProductCategoryId>toy_display_on_website</ProductCategoryId> 
     <Rank>5183</Rank> 
     </SalesRank> 
     <SalesRank> 
     <ProductCategoryId>2229575011</ProductCategoryId> 
     <Rank>11</Rank> 
     </SalesRank> 
    </SalesRankings> 
    </Product> 
</Products> 
</GetMatchingProductForIdResult> 

Как я могу получить ранг продаж, сумму, размер продукта, идентификатор и ASIN? Я уже некоторое время смотрю вокруг и ничего не нашел о толстой кишке.

Мой код, который я пытался использовать это:

for($i = 0; $i < (count($groupedArrays) - 0); $i++){ 
    $xmlFilePath = 'xml/' . $file_name . $i . '.xml'; 
    $xml = simplexml_load_file($xmlFilePath); 

foreach($xml->children() as $items) { 
    if ($items->GetMatchingProductForIdResult->Error) { 
     continue; 
    } 
    $upcTag = $items['Id'] . ','; 
    if($items->GetMatchingProductForIdResult->Products->Product->AttributeSets->Relationship == FALSE){ 
     echo $items->GetMatchingProductForIdResult->Products->Product->AttributeSets->SalesRankings->SalesRank[0] . ','; 
    } else { 
     echo $items->GetMatchingProductForIdResult->Products->Product->AttributeSets->Relationship->VariationParent->Identifiers->MarketplaceASIN->ASIN . ','; 
    } 
     $subject = "<ns2:Amount></ns2:Amount>"; 
     preg_match_all('/<[^:]*:([^>]*)>(.*)<\/[^>]*>/', $subject, $matches); 

$i = 1; 
$ii = 0; 
foreach ($matches as $key => $value) {   
    $newArr[$matches[$i][$ii]] = $matches[$ii][$ii];    
    $ii++; 
    $i++; 
} 

$result = array_filter($newArr); 
foreach($result as $key => $value){ 
echo $key." = ".$value. "<br/>"; 
}; 
} 

Существует для цикла перед этим тот, который получает ответ и сохраняет его в качестве .xml в моей папке XML. я не могу понять, что я делаю неправильно, и помощь будет очень признательна! Я работаю над этой частью чуть больше 8-9 часов. Заранее спасибо!

ответ

1

Если вы хотите получить недвижимость из своего xml, вы можете использовать simplexml_load_file.

Для автоматического <ns2:ItemAttributes.. вы можете использовать метод SimpleXMLElement children с соответствующим пространством имен «ns2»

Может быть, этот пример, который получает некоторые из свойств может помочь вам:

$xml = simplexml_load_file($xmlFilePath); 
$ns = $xml->getNamespaces(true); 

$asin = ''; 
$salesRankings = array(); 
$amount = ''; 

foreach ($xml->Products->Product as $product) { 
    $asin = (string)$product->Identifiers->MarketplaceASIN->ASIN; 

    foreach ($product->SalesRankings->SalesRank as $salesRank) { 
     $salesRankings[] = array(
      "ProductCategoryId" => (string)$salesRank->ProductCategoryId, 
      "Rank" => (string)$salesRank->Rank 
     ); 
    } 
    foreach ($product->AttributeSets->children($ns['ns2']) as $itemAttributes) { 
     $amount = (string)$itemAttributes->ListPrice->Amount; 
    } 
} 
+0

Код не сделал Работа. Я не уверен, что я делаю неправильно. Когда я запускаю этот код, он дает мне кучу предупреждений. Я не уверен, что происходит. Не могли бы вы просто записать это из моего текущего кода? – McStuffins

+0

@Robert Код основан на предоставленном xml в вопросе. Вы можете увидеть результат в этом [demo] (https://3v4l.org/3e3Qv) (обратите внимание, что в демонстрации я использовал [simplexml_load_string] (http://php.net/manual/en/function.simplexml -load-string.php) вместо [simplexml_load_file] (http://php.net/manual/en/function.simplexml-load-file.php). Каковы предупреждения, которые вы получаете? Является ли структура xml то же самое, когда вы получаете предупреждения?) –

+0

было несколько предупреждений, но только одна ошибка, он сказал «фатальный вызов ошибки для неопределенной функции getNamespace() в строке 121». Строка 121 - это строка, определяющая $ ns. Когда я что-то печатаю, он ничего не распечатывает. Я помещал печать внутри цикла for. Поскольку этот код перезаписывается, как бы я мог бы сэкономить все до csv-файла? Я также понял, что вы использовали simplexm_load_string. Так что все, что мне нужно сделать, это изменить это на simplexml_load_file? – McStuffins

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