DOMDocument не делает HTML-теги в DOMNodes

Я пытаюсь манипулировать некоторыми данными HTML с классом DOMDocument, но, похоже, он работает не так, как ожидалось.

$html_str = <<< 'EOD'
<h2>Hello world</h2>
<p>This is the first paragraph</p>
<p>Now for a second</p>
<p>This is the last</p>
EOD;

$html_doc = new DOMDocument();
$html_doc->loadHTML( $html_str ); //loadHTML wraps code in html and body nodes
$body_node = $html_doc->getElementsByTagName( 'body' )->item( 0 ); //Select body node which is holding loaded html data

echo $html_doc->saveHTML( $body_node );

//Outputs as expected
//
//<h2>Hello world</h2>
//<p>This is the first paragraph</p>
//<p>Now for a second</p>
//<p>This is the last</p>
//

echo count( $body_node->childNodes );

//Outputs only 1

echo $html_doc->saveHTML( $body_node->childNodes->item( 0 ) );

//Outputs
//<h2>Hello world</h2>

Почему не загружаются данные HTML, которые я называю отдельными узлами. Я хочу иметь возможность манипулировать каждым из тех узлов, которые находятся внутри тега body, но, как вы можете видеть, я не могу настроить таргетинг с помощью свойства cildeNodes.

1 ответ

$body_node->childNodes - это объект DOMNodeList, который не реализует интерфейс Countable. Используйте $body_node->childNodes->length вместо count($body_node->childNodes).

DOMNodeList реализует интерфейс Traversable, поэтому вы можете DOMNodeList дочерние узлы, используя foreach.

licensed under cc by-sa 3.0 with attribution.