DOMXPath::evaluate()
(PHP 5 >= 5.1.0, PHP 7)
Evaluates the given XPath expression and returns a typed result if possible
说明
public DOMXPath::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')); ?>