DOMXPath::evaluate

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

DOMXPath::evaluate Évalue une expression XPath donnée et retourne un résultat typé si possible

Description

public DOMXPath::evaluate(string $expression, ?DOMNode $contextNode = null, bool $registerNodeNS = true): mixed

Exécute l'expression XPath expression et retourne un résultat typé si possible.

Liste de paramètres

expression

L'expression XPath à exécuter.

contextNode

Le paramètre optionnel contextNode peut être spécifié pour effectuer des requêtes XPath relatives. Par défaut, les requêtes sont relatives à l'élément root.

registerNodeNS

Indique s'il faut automatiquement enregistrer les préfixes de namespace en vigueur du nœud de contexte dans l'objet DOMXPath. Cela peut être utilisé pour éviter d'avoir à appeler manuellement DOMXPath::registerNamespace() pour chaque namespace en vigueur. En cas de conflit de préfixes de namespace, seul le préfixe de namespace descendant le plus proche est enregistré.

Valeurs de retour

Retourne un résultat typé si possible ou un DOMNodeList contenant tous les nœuds correspondant à l'expression XPath expression.

Si le paramètre expression est mal formé ou bien si le paramètre contextNode est invalide, la méthode DOMXPath::evaluate() retournera false.

Exemples

Exemple #1 Récupération du nombre total de livres anglais

<?php

$doc
= new DOMDocument;

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

$xpath = new DOMXPath($doc);

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

// notre requête est relative au nœud tbody
$query = 'count(row/entry[. = "en"])';

$entries = $xpath->evaluate($query, $tbody);
echo
"Il y a $entries livres anglais\n";

?>

L'exemple ci-dessus va afficher :

Il y a 2 livres anglais

Voir aussi

add a note add a note

User Contributed Notes 5 notes

up
4
Damien Bezborodov
13 years ago
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])".
up
3
daniel at danielnorton dot com
13 years ago
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.
up
3
yuriucsal at NOSPAM dot yahoo dot com dot br
19 years ago
this class can substitute the method evaluate while it is not validated. Made for Yuri Bastos and Jo�o Gilberto Magalh�es.

<?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

           
}
        }
    }
?>
up
1
aazaharov81 at gmail dot com
9 years ago
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'));
?>
up
1
danny at webdevelopers dot eu
4 years ago
The only way how to distinguish FALSE returned value from syntax error FALSE is to re-run the XPath expression wrapped in string() function. If must return empty string. If it returns FALSE again then it is an error.

<?php

        $ret
=$this->xp->evaluate($eval, $context);

       
// Error detection: DOMXPath::evaluate() returns FALSE on error
        // so does DOMXPath::evaluate("boolean(/nothing)")
        // @workaround webdevelopers.eu
       
if ($ret === false && $this->xp->evaluate("string($eval)", $context) === false) {
            throw new
Exception("Invalid XPath expression ".json_encode($eval), 3491);
        }
?>
To Top