Чтение и использование значений атрибутов XML

Я имею в наличии эту проблему 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:

  • Реализация условия в XPath
  • SimpleXML получает содержимое элемента на основе значения атрибута

Также с некоторых дней, когда было предложено расширить форму SimpleXMLElement чтобы обеспечить функцию полезности, чтобы на самом деле сделать это с помощью простого интерфейса:

  • PHP / XML – как читать multible sub
  • simplexml_load_file – избыточный элемент с пустым значением преобразуется в новый объект 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