node leer example ejemplo domelement php xpath domdocument

leer - ¿Cómo obtener el primer nivel de elementos dom por Domdocument PHP?



php dom node (1)

Se puede acceder al primer nivel de elementos debajo del nodo raíz con

$dom->documentElement->childNodes

La propiedad childNodes contiene una DOMNodeList , que puede repetir con foreach .

Ver DOMDocument::documentElement

Este es un atributo de conveniencia que permite el acceso directo al nodo secundario que es el elemento de documento del documento.

y DOMNode::childNodes

Una DOMNodeList que contiene todos los elementos secundarios de este nodo. Si no hay hijos, esta es una DOMNodeList vacía.

Como childNodes es una propiedad de DOMNode cualquier clase que extienda DOMNode (que es la mayoría de las clases en DOM) tiene esta propiedad, por lo que para obtener el primer nivel de elementos debajo de un elemento DOMElement es acceder a la propiedad childNode de ese DOMElement.

Tenga en cuenta que si usa DOMDocument::loadHTML() en HTML no válido o documentos parciales, el módulo de análisis HTML agregará un esqueleto HTML con html y etiquetas de cuerpo, por lo que en el árbol DOM, el HTML en su ejemplo será

<!DOCTYPE html … "> <html><body><div id="header"> </div> <div id="content"> <div id="sidebar"> </div> <div id="info"> </div> </div> <div id="footer"> </div></body></html>

que debe tener en cuenta al atravesar o usar XPath. En consecuencia, usando

$dom = new DOMDocument; $dom->loadHTML($str); foreach ($dom->documentElement->childNodes as $node) { echo $node->nodeName; // body }

solo iterará el nodo <body> DOMElement. Sabiendo que libxml agregará el esqueleto, tendrá que iterar sobre los niñodos del elemento <body> para obtener los elementos div de su código de ejemplo, por ej.

$dom->getElementsByTagName(''body'')->item(0)->childNodes

Sin embargo, al hacerlo también se tendrán en cuenta los nodos de espacio en blanco, por lo que debe asegurarse de establecer preserveWhiteSpace en falso o consultar el elemento correcto nodeType si solo desea obtener los nodos DOMElement , por ejemplo

foreach ($dom->getElementsByTagName(''body'')->item(0)->childNodes as $node) { if ($node->nodeType === XML_ELEMENT_NODE) { echo $node->nodeName; } }

o usa XPath

$dom->loadHTML($str); $xpath = new DOMXPath($dom); foreach ($xpath->query(''/html/body/*'') as $node) { echo $node->nodeName; }

Información Adicional:

¿Cómo obtener el primer nivel de elementos dom por Domdocument PHP?

Ejemplo con código que no funciona - tomado de Q & A: http: //stackoverflow.com/questions/1540302/how-to-get-nodes-in-first-level-using-php-domdocument

<?php $str=<<< EOD <div id="header"> </div> <div id="content"> <div id="sidebar"> </div> <div id="info"> </div> </div> <div id="footer"> </div> EOD; $doc = new DOMDocument(); $doc->loadHTML($str); $xpath = new DOMXpath($doc); $entries = $xpath->query("/"); foreach ($entries as $entry) { var_dump($entry->firstChild->nodeValue); } ?>

Gracias, Yosef