Я следую этому уроку:
Зацикливание на части XML проблематично.
PHP почему-то рассматривает объект DOM как массив. Кроме того, var_dump не возвращает ничего об атрибутах объекта, кроме длины, но вывод программы выглядит так, как будто он появился из ниоткуда. Может ли цикл foreach как-то проходить через объект? И если да, то где содержатся эти атрибуты (имя узла и значение узла), потому что var_dump не показывает их?
$xml=new DOMDocument ();
$xml->load('note.xml');
$array_of_nodes=$xml->documentElement->childNodes;
var_dump($array_of_nodes);
foreach($array_of_nodes as $item) {
echo $item->nodeName." ".$item->nodeValue."<br>";
}
Функция дампа Var возвращает это:
object (DOMNodeList) # 3 (1) {[«length»] => int (9)} #text
Но исполняемый код выглядит так:
текст =
к = туве
текст =
от = Яни
текст =
заголовок = напоминание
текст =
body = Не забывай меня в эти выходные!
текст =
childNodes
является собственностью DOMNodeList
тип. Причина, по которой var_dump ничего не показывает, заключается в том, что var_dump показывает только те свойства класса, которые были объявлены их разработчиками путем вызова таких C-функций как
ZEND_API int zend_declare_property(...)
ZEND_API int zend_declare_property_null(...)
ZEND_API int zend_declare_property_bool(...)
ZEND_API int zend_declare_property_long(...)
ZEND_API int zend_declare_property_double(...)
ZEND_API int zend_declare_property_string(...)
ZEND_API int zend_declare_property_stringl(...)
Источник: ответ от Аконда: Почему var_dump не работает с объектами DomDocument во время печати ($ dom->saveHTML ()) делает?
То есть разработчики расширения DOM решили не выставлять структуру DOMNodeList
учебный класс.
Причина, по которой вы можете перебирать DOMNodeList
потому что это реализует Traversable
интерфейс, который сигнализирует о том, что класс может быть повторен с помощью foreach
,
DOMNodeList
реализует несколько интерфейсов: Traversable
, ArrayAccess
а также Countable
, Это позволяет использовать общий синтаксис для доступа к объектам узла в списке. Без них вам нужно будет использовать определенные методы и свойства, подобные этим:
for ($i = 0; $c = $nodeList->length; $i < $c; $i++) {
$node = $nodeList->item($i);
//...
}
Traversable
позволяет использовать foreach
,
foreach ($nodeList as $node) {
//...
}
ArrayAccess
позволяет использовать синтаксис массива для доступа к узлам по индексу, он заменяет ->item(...)
звонки с [...]
,
if (isset($nodeList[0])) {
$node = $nodeList[0];
//...
}
Countable
позволяет использовать count($nodeList)
вместо $nodeList->length
,
Traversable
оказывает наибольшее визуальное воздействие. Это значительно снижает сложность звонка. Но это только первая выгода. Вы можете проверить по интерфейсам, используя печатные или instanceof
, Это разъединяет ваш код, делая его более надежным и пригодным для повторного использования.
Однако зацикливание через DOM намного проще, если вы используете выражения Xpath. Если вы ранее использовали селекторы CSS, вы можете думать о выражениях Xpath как о более мощном родственнике.
$document = new DOMDocument();
$document->load('note.xml');
$xpath = DOMXpath($document);
foreach($xpath->evaluate('/note') as $item) {
echo 'To: ', $xpath->evaluate('string(to)', $item), "\n";
echo 'From: ', $xpath->evaluate('string(from)', $item), "\n";
echo 'Title: ', $xpath->evaluate('string(heading)', $item), "\n";
echo 'Text: ', $xpath->evaluate('string(body)', $item), "\n";
}