(PHP 5, PHP 7, PHP 8)
DOMXPath::query — Evalúa la expresión XPath dada
$expression
, ?DOMNode $contextNode
= null
, bool $registerNodeNS
= true
): mixed
Evalúa la expresión expression
XPath dada.
expression
La expresión XPath a ejecutar.
contextNode
El argumento opcional contextNode
puede ser especificado
para realizar consultas XPath relativas. Por omisión, las consultas son relativas
al elemento raíz.
registerNodeNS
Whether to automatically register the in-scope namespace prefixes of the context node to the DOMXPath object. This can be used to avoid needing to call DOMXPath::registerNamespace() manually for each in-scope namespaces. When a namespace prefix conflict exists, only the nearest descendant namespace prefix is registered.
Devuelve un DOMNodeList que contiene todos los nodos
que coinciden con la expresión expression
XPath dada.
Todas las expresiones que no devuelvan ningún nodo devolverán
un DOMNodeList vacío.
Si el argumento expression
está malformado o
el argumento contextNode
es inválido,
DOMXPath::query() devolverá false
.
Los siguientes errores pueden ocurrir al utilizar una expresión que invoca retrollamadas PHP.
php:function
es utilizada y el nombre del gestor
no es un string.
Ejemplo #1 Recuperación de todos los libros en inglés
<?php
$doc = new DOMDocument;
// No queremos preocuparnos por los espacios en blanco
$doc->preserveWhiteSpace = false;
$doc->load('examples/book-docbook.xml');
$xpath = new DOMXPath($doc);
// Comenzamos en el elemento raíz
$query = '//book/chapter/para/informaltable/tgroup/tbody/row/entry[. = "en"]';
$entries = $xpath->query($query);
foreach ($entries as $entry) {
echo "Libro encontrado {$entry->previousSibling->previousSibling->nodeValue}," .
" por {$entry->previousSibling->nodeValue}\n";
}
?>
El resultado del ejemplo sería:
Libro encontrado : The Grapes of Wrath, por John Steinbeck Libro encontrado : The Pearl, por John Steinbeck
También podemos utilizar el argumento contextNode
para acortar nuestra expresión :
<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->load('examples/book-docbook.xml');
$xpath = new DOMXPath($doc);
$tbody = $doc->getElementsByTagName('tbody')->item(0);
// nuestra consulta es relativa al nodo tbody
$query = 'row/entry[. = "en"]';
$entries = $xpath->query($query, $tbody);
foreach ($entries as $entry) {
echo "Libro encontrado : {$entry->previousSibling->previousSibling->nodeValue}," .
" por {$entry->previousSibling->nodeValue}\n";
}
?>