Как перебрать элементы 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, чтобы я мог получить доступ к определенным дочерним узлам по имени?

4 ответа

Решение

Не проверено, но как насчет:

$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

Другие вопросы по тегам