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'')