node new leer ejemplo domnode php dom

new - php domnode to string



¿Cómo hago una consulta XPath en un DOMNode? (3)

Pase el nodo como el segundo argumento a DOMXPath::query

contextnode : se puede especificar el contextnode opcional para hacer consultas XPath relativas. De forma predeterminada, las consultas son relativas al elemento raíz.

Ejemplo:

foreach ($nodes as $node) { foreach ($x_path->query(''h3|a'', $node) as $child) { echo $child->nodeValue, PHP_EOL; } }

Esto utiliza el operador UNION para un resultado de

Get me 1 and me too 1 Get me 2 and me too 1

Si no necesita ninguna consulta compleja, también puede hacer

foreach ($nodes as $node) { foreach ($node->getElementsByTagName(''a'') as $a) { echo $a->nodeValue, PHP_EOL; } }

O incluso mediante la iteración de los nodos secundarios (tenga en cuenta que esto incluye todos los nodos de texto)

foreach ($nodes as $node) { foreach ($node->childNodes as $child) { echo $child->nodeName, PHP_EOL; } }

Sin embargo, todo eso es innecesario, ya que puede obtener estos nodos directamente:

$nodes= $x_path->query("/html/body//div[@class=''listing'']/div[last()]"); foreach ($nodes as $i => $node) { echo $i, $node->nodeValue, PHP_EOL; }

le dará dos nodos en la última división div de todos los divs con un valor de atributo de clase de listado y generará los valores de nodo de texto combinados, incluidos los espacios en blanco

0 Get me 1 and me too 1 1 Get me 2 and me too 1

Igualmente, los siguientes

"//div[@class=''listing'']/div[last()]/node()[name() = ''h3'' or name() = ''a'']"

le dará los cuatro nodos secundarios H3 y A y la salida

0Get me 1 1and me too 1 2Get me 2 3and me too 1

Si necesita diferenciarlos por nombre mientras está iterando sobre ellos, puede hacer

foreach ($nodes as $i => $node) { echo $i, $node->nodeName, $node->nodeValue, PHP_EOL; }

que luego dará

0h3Get me 1 1aand me too 1 2h3Get me 2 3aand me too 1

¿Hay una manera de hacer una consulta xpath en un DOMNode? ¿O al menos convertirlo a un DOMXPath?

<html> ... <div id="content"> ... <div class="listing"> ... <div></div> <div></div> <div class=''foo''> <h3>Get me 1</h3> <a>and me too 1</a> </div> </div> <div class="listing"> ... <div></div> <div></div> <div class=''foo''> <h3>Get me 2</h3> <a>and me too 1</a> </div> </div> .... </div> </html>

Este es mi código. Estoy tratando de obtener una lista de arreglos que tenga los valores de h3 y las etiquetas en cada arreglo. Para hacer eso, necesitaba obtener cada lista, y luego obtener el valor de h3 y de una etiqueta en cada lista.

$html_dom = new DOMDocument(); @$html_dom->loadHTML($html); $x_path = new DOMXPath($html_dom); $nodes= $x_path->query("//div[@id=''content'']//div[@class=''listing'']"); foreach ($nodes as $node) { // I want to further dig down here using query on a DOMNode }


Proporcione su $node como un nodo de contexto.

foreach ($nodes as $node) { $morenodes = $x_path->query(".//h3", $node); }

Consulte $contextnode en el manual: DOMXPath::query


Solo para completarlo, hay un método DOMNode::getNodePath que devuelve xpath de ese nodo. Por lo tanto, también puede usar $x_path->query($node->getNodePath().''//h3'')