У меня есть файл 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, чтобы я мог получить доступ к определенным дочерним узлам по имени?
Не тестировалось, но как насчет:
$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);