Я имею в наличии эту проблему XML, у меня есть XML-файл, который я просматриваю, чтобы найти значения. Все работает нормально, я могу читать все дочерние узлы, но я застрял в этом разделе. Часть XML, содержащая фотографии, имеет одно и то же имя узла, за исключением атрибута, как я могу указать, как просматривать в соответствии с этим и принимать значение имени файла для каждого из них
XML ... <Engine> <Fuel>Unleaded</Fuel> <Cylinders>4</Cylinders> <Induction>Normally aspirated</Induction> </Engine> <Photo order="1"> <Filename>http://img.ruphp.com/php/b5092588_2.jpg</Filename> </Photo> <Photo order="2"> <Filename>http://img.ruphp.com/php/b5092588_3.jpg</Filename> </Photo> <Photo order="3"> <Filename>http://img.ruphp.com/php/b5092588_4.jpg</Filename> </Photo> <Photo order="4"> <Filename>http://img.ruphp.com/php/b5092588_5.jpg</Filename> </Photo> <Photo order="5"> <Filename>http://img.ruphp.com/php/b5092588_6.jpg</Filename> ...
В моем php-файле у меня есть этот код, который поможет мне найти значения:
$import->stock_no =(string)$item->Invoice->Vehicle->VehicleStock; $import->image1 =(string)$item->Invoice->Vehicle->Photo->attributes(order="1")->Filename;
Конечно, это не сработает, как я могу просматривать все узлы фотографий (у меня есть 8 фотографий, с которых мне нужно принимать значения)
Я хочу иметь $ import-> image1 = (имя файла в атрибутах pohoto 1), sames для изображения 2, 3 и т. Д.
Спасибо.
То, что вы пытаетесь достичь, (в первую очередь) возможно с помощью запроса xpath. Вы хотите получить доступ к дочернему узлу на основе значения атрибута. Лучшие справочные вопросы в SimpleXML:
Также с некоторых дней, когда было предложено расширить форму SimpleXMLElement
чтобы обеспечить функцию полезности, чтобы на самом деле сделать это с помощью простого интерфейса:
Однако ваш случай немного отличается из-за синтаксиса, который вы предлагаете:
$xml = simplexml_load_string($buffer, 'MySimpleXMLElement'); echo $xml->Vehicle->Photo->attribute("order", "1")->Filename; // prints "http://img.ruphp.com/php/b5092588_2.jpg"
Вместо использования обычного SimpleXMLElement
этом примере используется расширенный один (примерный) MySimpleXMLElement
. Он запускает запрос XPath внутри на основе входных параметров и основывается на родительском элементе, на котором он работает (здесь элемент Photo
):
/** * Class MySimpleXMLElement * * Example of how to magically access named child-nodes based * on an attribute value of theirs. */ class MySimpleXMLElement extends SimpleXMLElement { public function attribute($name, $value) { $nodes = $this->xpath( sprintf('../%s[@%s = "%s"]', $this->getName(), $name, $value) ); return $nodes ? $nodes[0] : NULL; } }
Этот новый MySimpleXMLElement::attribute()
(извиняемые attributes()
уже использовался ) затем доступен на каждом узле. Так что получайте удовольствие.
Естественно, вы также можете написать так:
$xml = simplexml_load_string($buffer); echo $xml->Vehicle->xpath('Photo[@order="1"]')[0]->Filename; // prints "http://img.ruphp.com/php/b5092588_2.jpg"
расширенный SimpleXMLElement в основном по соображениям удобства. И, вероятно, более легко отладить, если вы еще не владеете Xpath.
В прошлый раз, когда я расширил SimpleXMLElement в Stackoverflow, в указанном ответе на «simplexml_load_file – избыточный элемент с пустым значением был преобразован в новый объект SimpleXMLElement Object» .
Попробуй это
<?php $xml = '<Engine> <Fuel>Unleaded</Fuel> <Cylinders>4</Cylinders> <Induction>Normally aspirated</Induction> </Engine> <Photo order="1"> <Filename>http://img.ruphp.com/php/b5092588_2.jpg</Filename> </Photo> <Photo order="2"> <Filename>http://img.ruphp.com/php/b5092588_3.jpg</Filename> </Photo>'; $xml="<Wraper>".$xml."</Wraper>"; $parse=new SimpleXMLElement($xml); echo "Engine Fuel:".$parse->Engine->Fuel; echo "<br/>Engine Cylinders:".$parse->Engine->Cylinders; echo "Photos<br/>"; foreach ($parse->Photo as $photo) { echo "<br/>Photo Order: ".$photo->attributes(); echo "<br/>Photo URL: ".$photo->Filename; echo "<hr/>"; } ?>
сладкий и простой с xpath
:
$xml = simplexml_load_string($x); // assume XML in $x $photos = $xml->xpath("//Photo"); // select all Photo nodes and their children in an array foreach ($photos as $photo) echo "order: $photo[order], file: $photo->Filename<br />"; // simple output
см. его работу: http://3v4l.org/SJmEg