Почему PHP обрабатывает этот объект DOM как массив?

Я следую этому уроку:

https://www.w3schools.com/php/php_xml_dom.asp

Зацикливание на части 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 = Не забывай меня в эти выходные!

текст =

1

Решение

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,

0

Другие решения

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";
}
0

По вопросам рекламы [email protected]