DOMXPath->evaluate()

(no version information, might be only in CVS)

DOMXPath->evaluate() --  Evaluates the given XPath expression and returns a typed result if possible.

说明

class DOMXPath {

mixed evaluate ( string expression [, DOMNode contextnode] )

}

Executes the given XPath expression and returns a typed result if possible.

参数

expression

The 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.

返回值

Returns a typed result if possible or a DOMNodeList containing all nodes matching the given XPath expression.

范例

例子 1. Getting the count of all the english books

<?php

$doc
= new DOMDocument;

$doc->load('book.xml');

$xpath = new DOMXPath($doc);

$tbody = $doc->getElementsByTagName('tbody')->item(0);

// our query is relative to the tbody node
$query = 'count(row/entry[. = "en"])';

$entries = $xpath->evaluate($query, $tbody);
echo
"There are $entries english books\n";

?>

上例将输出:

There are 2 english books


add a note add a note User Contributed Notes
marwan dot zeineddine at gmail dot com
30-Oct-2006 11:50
I've compiled and installed php 5.1.6 on linux. Whereas i was getting "undefined function" whenever i would use evaluate(). Now i get it to run but the count() XPATH function does not work properly. I simply don't get anything back.
yuriucsal at NOSPAM dot yahoo dot com dot br
07-Mar-2005 04:55
this class can substitute the method evaluate while it is not validated. Made for Yuri Bastos and Joo Gilberto Magalhes.

<?php

  
class XPtahQuery
  
{
      
// function returns a DOMNodeList from a relative xPath
      
public static function selectNodes($pNode, $xPath)
       {

          
$pos = strpos(self::getFullXpath($pNode),"/",1);
          
$xPathQuery = substr(self::getFullXpath($pNode),$pos);//to paste  /#document[1]/
          
$xPathQueryFull = $xPathQuery. $xPath;
          
$domXPath = new DOMXPath($pNode->ownerDocument);
          
$rNodeList = $domXPath->query($xPathQueryFull);

               return
$rNodeList;
       }
      
// function returns a DOMNode from a xPath from other DOMNode
      
public static function selectSingleNode($pNode, $xPath)
       {

          
$pos = strpos(self::getFullXpath($pNode),"/",1);
          
$xPathQuery = substr(self::getFullXpath($pNode),$pos);//to paste  /#document[1]/
          
$xPathQueryFull = $xPathQuery. $xPath;
          
$domXPath = new DOMXPath($pNode->ownerDocument);
          
$rNode = $domXPath->query($xPathQueryFull)->item(0);

               return
$rNode;
       }
      
//utilitaries functions off selectSingleNode
      
private function getNodePos($pNode, $nodeName)
       {
           if(
$pNode == null)
               {
                       return
0;
           }
           else
           {
              
$var = 0;
                   if (
$pNode->previousSibling != null)
                   {
                   if (
$pNode->previousSibling->nodeName == $nodeName)
                   {
                      
$var = 1;
                   }
                   }
                   return
self::getNodePos($pNode->previousSibling, $nodeName) + $var;
           }
       }
      
//utilitaries functions off selectSingleNode
      
private function getFullXpath($pNode)
       {
           if(
$pNode == null)
               {
                       return
"";
           }
           else
           {

               return
self::getFullXpath($pNode->parentNode) . "/" . $pNode->nodeName . "[" .strval(self::getNodePos($pNode, $pNode->nodeName)+1) . "]";//+1 to get the real xPath index

          
}
       }
   }
?>
ernest at vogelsinger dot at
24-Jan-2005 02:54
The DOMXPath::evaluate() method will not be available before v.5.1 (see bug database #31593). Only query() is available, which cannot evaluate all XPath expressions,such as count() or not().