Как выполнить итерацию через элементы 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, чтобы я мог получить доступ к определенным дочерним узлам по имени?
Ответы
Ответ 1
Не тестировалось, но как насчет:
$elements = $dom->getElementsByTagName('foo');
$data = array();
foreach($elements as $node){
foreach($node->childNodes as $child) {
$data[] = array($child->nodeName => $child->nodeValue);
}
}
Ответ 2
Как правило, лучше использовать XPath для запроса документа, чем для написания кода, который зависит от знания структуры документа. Есть две причины. Во-первых, гораздо меньше кода для тестирования и отладки. Во-вторых, если структура документа изменится, гораздо проще изменить запрос XPath, чем изменить кучу кода.
Конечно, вам нужно изучить XPath, но (большая часть) XPath - это не ракетостроение.
PHP DOM использует метод xpath_eval
для выполнения запросов XPath. Он документировал здесь, а примечания пользователя включают некоторые довольно хорошие примеры.
Ответ 3
Вот еще один (ленивый) способ сделать это.
$data[][$node->nodeName] = $node->nodeValue;
Ответ 4
С 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