(PHP 5, PHP 7, PHP 8)
DOMXPath::query — Evalúa la expresión XPath dada
$expression
, ?DOMNode$contextNode
= null
, bool$registerNodeNS
= true
): mixed Ejecuta la expresión XPath dada por expression
.
expression
La expresión XPath a ejecutar.
contextNode
El parámetro opcional contextNode
se puede especificar para hacer consultas XPath relativas. Por omisión, las consultas son relativas al elemento raíz.
registerNodeNS
El parámetro opcional registerNodeNS
puede ser especificado para deshabilitar el registro automático del nodo de contexto.
Devuelve un objeto DOMNodeList que contiene todos los nodos coincidentes con la expresión XPath dada por expression
. Cualquier expresión que no devuelva nodos devolverá un objeto DOMNodeList vacío.
Si el parámetro expression
está malformado o el parámetro contextNode
es inválido, DOMXPath::query() devuelve false
.
Ejemplo #1 Obtener todos los libros en inglés
<?php
$doc = new DOMDocument;
// No queremos molestar con espacios en blanco
$doc->preserveWhiteSpace = false;
$doc->load('book.xml');
$xpath = new DOMXPath($doc);
// Empezamos desde el elemento root
$consulta = '//book/chapter/para/informaltable/tgroup/tbody/row/entry[. = "en"]';
$entradas = $xpath->query($consulta);
foreach ($entradas as $entrada) {
echo "Se encotró {$entrada->previousSibling->previousSibling->nodeValue}," .
" por {$entrada->previousSibling->nodeValue}\n";
}
?>
El resultado del ejemplo sería:
Se encontró The Grapes of Wrath, por John Steinbeck Se encontró The Pearl, por John Steinbeck
También podemos usar el parámetro contextNode
para acortar nuestra expresión:
<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->load('book.xml');
$xpath = new DOMXPath($doc);
$tbody = $doc->getElementsByTagName('tbody')->item(0);
// nuestra consulta es relativa al nodo tbody
$consulta = 'row/entry[. = "en"]';
$entradas = $xpath->query($consulta, $tbody);
foreach ($entradas as $entrada) {
echo "Se encontró {$entrada->previousSibling->previousSibling->nodeValue}," .
" por {$entrada->previousSibling->nodeValue}\n";
}
?>