• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • DOMXPath::evaluate()

    (PHP 5 >= 5.1.0, PHP 7)

    Evaluates the given XPath expression and returns a typed result if possible

    说明

    publicDOMXPath::evaluate(string $expression[,DOMNode$contextnode[,bool $registerNodeNS= TRUE]]): mixed

    Executes the given XPath$expressionand returns a typed result if possible.

    参数

    $expression

    The XPath expression to execute.

    $contextnode

    The optional$contextnodecan be specified for doing relative XPath queries. By default, the queries are relative to the root element.

    $registerNodeNS

    The optional$registerNodeNScan be specified to disable automatic registration of the context node.

    返回值

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

    If the$expressionis malformed or the$contextnodeis invalid,DOMXPath::evaluate() returns FALSE.

    更新日志

    版本说明
    5.3.3 The$registerNodeNSparameter was added.

    范例

    Example #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
    

    参见

    • DOMXPath::query() Evaluates the given XPath expression
    If your expression returns a node set, you will get a DOMNodeList instead of a typed result. Instead, try modifying your expression from "//node[1]" to "string(//node[1])".
    Note that this method does not provide any means to distinguish between a successful result that returns FALSE and an error.
    For example, this will succeed and return FALSE:
    <?php $xpath->evaluate("1 = 0"); ?>
    One workaround when you know you are expecting a Boolean is to wrap the result with string(). e.g.
    <?php $xpath->evaluate("string(1 = 0)"); ?>
    This will return a string "false" on success, or the Boolean FALSE on error.
    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
          }
        }
      }
    ?>
    
    To query DOMNodes by their HTML classes, use such snippet
    <?php
    // CssClassXPathSelector
    function ccxs($class) {
      return '[contains(concat(" ", normalize-space(@class), " "), " ' . $class . ' ")]';
    }
     // then just
     $domitems = $this->xpath("//*[@id='searchResultsRows']//a" . ccxs('listing_row'));
    ?>