(PHP 5, PHP 7)
DOMXPath::query — Evaluates the given XPath expression
$expression
   [, DOMNode $contextnode
   [, bool $registerNodeNS = true
  ]] )
   Executes the given XPath expression.
  
expressionThe XPath expression to execute.
contextnode
       The optional contextnode can be specified for
       doing relative XPath queries. By default, the queries are relative to 
       the root element.
      
registerNodeNS
       The optional registerNodeNS can be specified to 
       disable automatic registration of the context node.
      
   Returns a DOMNodeList containing all nodes matching
   the given XPath expression. Any expression which
   does not return nodes will return an empty
   DOMNodeList.
  
   If the expression is malformed or the
   contextnode is invalid,
   DOMXPath::query() returns FALSE.
  
| Version | Description | 
|---|---|
| 5.3.3 | The registerNodeNSparameter was added. | 
Example #1 Getting all the english books
<?php
$doc = new DOMDocument;
// We don't want to bother with white spaces
$doc->preserveWhiteSpace = false;
$doc->Load('book.xml');
$xpath = new DOMXPath($doc);
// We starts from the root element
$query = '//book/chapter/para/informaltable/tgroup/tbody/row/entry[. = "en"]';
$entries = $xpath->query($query);
foreach ($entries as $entry) {
    echo "Found {$entry->previousSibling->previousSibling->nodeValue}," .
         " by {$entry->previousSibling->nodeValue}\n";
}
?>
The above example will output:
Found The Grapes of Wrath, by John Steinbeck Found The Pearl, by John Steinbeck
     We can also use the contextnode parameter to shorten
     our expression:
    
<?php
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
$doc->load('book.xml');
$xpath = new DOMXPath($doc);
$tbody = $doc->getElementsByTagName('tbody')->item(0);
// our query is relative to the tbody node
$query = 'row/entry[. = "en"]';
$entries = $xpath->query($query, $tbody);
foreach ($entries as $entry) {
    echo "Found {$entry->previousSibling->previousSibling->nodeValue}," .
         " by {$entry->previousSibling->nodeValue}\n";
}
?>