Это атрибут другого элемента. Предка. Судя по всему, префикс для отдельной группы. То есть примерно 123X для 1234 и 1235, a 567X для 5678, 5679 и 5670 и тд
У меня есть один рабочий пример, но я не смог его интегрировать в Ваш код. Он видит все номера PHP: $dom = new DOMDocument (); $dom->loadXML($response->toXML()); $xp = new DOMXPath($dom); $xp->registerNamespace("default", "http://mws.amazonservices.com/schema/Products/2011-10-01"); foreach ( $xp->query("//default:GetLowestOfferListingsForASINResult") as $asin ) { $prices = $xp->query("descendant::default:Product", $asin ); foreach ( $prices as $price ) { $ASIN = $xp->evaluate("string(descendant::default:MarketplaceASIN/default:ASIN/text())",$price); }
У вас и так все номера. 355172304X - не номер, а имя группы для 3551723044, 3551723045, 3551723046, 3551723041 и тп
Это именно отдельный полноценный номер товара, давайте откажемся от определения номер. Это именно Asin (Action pour une Suisse Indépendante et Neutre), как и все остальные, он не имеет ничего общего к другим Asinam / номерам.
В выложенном вами файле <ASIN>355172304X</ASIN> отсутствует. Но есть предок <ASIN>3551723044</ASIN> <GetLowestOfferListingsForASINResult ASIN='355172304X' status='Success'>
Я заново получил файл. Прикрепляю. На этот раз тут всё точно, каждый азин уникален и не принадлежит никому. Был запрос на 8 номеров и ответ пришёл на 8 номеров и 3 из них заканчиваются на Х. А вот такой ответ получаю через скрипт. В Верху в одну строку видны все Азины, но дальше с ценами их нет. Код (Text): 361302750X361302750X361302750X361302750X361302750X361302750X361302750X361302750XArray ( [0] => 3927458384"59.88"59.89"60.00"85.00"109.98"120.36" [1] => 3730700510"5.27"5.28"7.79"11.24"11.29"12.90" [2] => 3935063652"20.39"20.71"20.72"43.53" [3] => 3830490364"92.00"118.95"119.00" [4] => 3769112431"39.43"39.44"75.22"95.00" )
Есть, вижу. Но. PHP: echo '<pre>'; $query = '//r:ASIN'; $result = $objXmlDocument->xpath($query); print_r($result); Всё выводится. Код (Text): Array ( [0] => SimpleXMLElement Object ( [0] => 361302750X ) [1] => SimpleXMLElement Object ( [0] => 3927458384 ) [2] => SimpleXMLElement Object ( [0] => 382286935X ) [3] => SimpleXMLElement Object ( [0] => 3730700510 ) [4] => SimpleXMLElement Object ( [0] => 3935063652 ) [5] => SimpleXMLElement Object ( [0] => 342664133X ) [6] => SimpleXMLElement Object ( [0] => 3830490364 ) [7] => SimpleXMLElement Object ( [0] => 3769112431 ) )
Но их нет именно в этой части кода. Кода номера должны быть в одну строку с ценами, которые принадлежат им PHP: $out = array(); foreach($result2 as $asin) { $query = sprintf('//r:Product[r:Identifiers/r:MarketplaceASIN/r:ASIN=%s]/*/*/r:Price/r:LandedPrice/r:Amount', $asin); $result = $objXmlDocument->xpath($query); if(isset($result[0])) { $str = $asin.'"'; foreach($result as $item) { $str .= $item[0].'"'; } $out[] = chop($str); } } print_r ($out); Вот полностью Ваш код. PHP: <?php libxml_use_internal_errors(TRUE); $objXmlDocument = simplexml_load_file("asin333.xml"); $objXmlDocument->registerXPathNamespace('r', 'http://mws.amazonservices.com/schema/Products/2011-10-01'); if ($objXmlDocument === FALSE) { echo "There were errors parsing the XML file.\n"; foreach(libxml_get_errors() as $error) { echo $error->message; } exit; } echo '<pre>'; $result2 = $objXmlDocument->xpath('//r:ASIN'); //print_r($result2); foreach($result2 as $as) { echo $result2[0]; } $out = array(); foreach($result2 as $asin) { $query = sprintf('//r:Product[r:Identifiers/r:MarketplaceASIN/r:ASIN=%s]/*/*/r:Price/r:LandedPrice/r:Amount', $asin); $result = $objXmlDocument->xpath($query); if(isset($result[0])) { $str = $asin.'"'; foreach($result as $item) { $str .= $item[0].'"'; } $out[] = chop($str); } } print_r ($out); file_put_contents( 'filename.txt', join(PHP_EOL, $out), FILE_APPEND); sleep(1) ?> Код (Text): [0] => 3927458384"59.88"59.89"60.00"85.00"109.98"120.36" [1] => 3730700510"5.27"5.28"7.79"11.24"11.29"12.90" [2] => 3935063652"20.39"20.71"20.72"43.53" [3] => 3830490364"92.00"118.95"119.00" [4] => 3769112431"39.43"39.44"75.22"95.00"
Понятно. Проблема возникла из-за типа данных "номеров". Так как они на самом деле "строки" Вот в этой строке PHP: $query = sprintf('//r:Product[r:Identifiers/r:MarketplaceASIN/r:ASIN=%s]/*/*/r:Price/r:LandedPrice/r:Amount', $asin); Заключите %s в кавычки PHP: $query = sprintf('//r:Product[r:Identifiers/r:MarketplaceASIN/r:ASIN="%s"]/*/*/r:Price/r:LandedPrice/r:Amount', $asin);