Как выполнить итерацию через элементы DOM в PHP?

У меня есть файл XML, загруженный в документ DOM, я хочу перебирать все теги «foo», получая значения из каждого тега под ним. Я знаю, что могу получить значения через

$element = $dom->getElementsByTagName('foo')->item(0); foreach($element->childNodes as $node){ $data[$node->nodeName] = $node->nodeValue; } 

Однако то, что я пытаюсь сделать, это от XML,

 <stuff> <foo> <bar></bar> <value/> <pub></pub> </foo> <foo> <bar></bar> <pub></pub> </foo> <foo> <bar></bar> <pub></pub> </foo> </stuff> 

итерации по каждому тегу foo , а также получить конкретный бар или паб и получить значения оттуда. Теперь, как мне перебирать foo, чтобы я мог получить доступ к определенным дочерним узлам по имени?

Related of "Как выполнить итерацию через элементы DOM в PHP?"

Не тестировалось, но как насчет:

 $elements = $dom->getElementsByTagName('foo'); $data = array(); foreach($elements as $node){ foreach($node->childNodes as $child) { $data[] = array($child->nodeName => $child->nodeValue); } } 

Как правило, гораздо лучше использовать XPath для запроса документа, чем для написания кода, который зависит от знания структуры документа. Есть две причины. Во-первых, для тестирования и отладки гораздо меньше кода. Во-вторых, если структура документа изменится, гораздо проще изменить запрос XPath, чем изменить кучу кода.

Конечно, вам нужно изучить XPath, но (большинство) XPath – это не ракетостроение.

PHP DOM использует метод xpath_eval для выполнения запросов XPath. Это описано здесь , и примечания пользователя включают некоторые довольно хорошие примеры.

Вот еще один (ленивый) способ сделать это.

 $data[][$node->nodeName] = $node->nodeValue; 

С FluidXML вы можете запросить и перебрать XML очень легко.

 $data = []; $store_child = function($i, $fooChild) use (&$data) { $data[] = [ $fooChild->nodeName => $fooChild->nodeValue ]; }; fluidxml($dom)->query('//foo/*')->each($store_child); 

https://github.com/servo-php/fluidxml