Как перебрать элементы 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);