PHP 8.4.1 Released!

DOMXPath::evaluate

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

DOMXPath::evaluateBelirtilen XPath ifadesini çözümler ve mümkünse yazılı bir sonuç verir

Açıklama

public DOMXPath::evaluate(string $ifade, ?DOMNode $bağlamsal_düğüm = null, bool $kaydet = true): mixed

ifade ile belirtilen XPath ifadesini çözümler ve mümkünse yazılı bir sonuç verir.

Bağımsız Değişkenler

ifade

Değerlenderelecek XPath ifadesi.

bağlamsal_düğüm

Seçimlik olarak, göreli XPath sorguları yapmak içindir. Öntanımlı olarak sorgular kök elemana göre çözümlenir.

kaydet

Bağlam düğümünün kapsam içi ad alanı öneklerinin DOMXPath nesnesine otomatik olarak kaydedilip kaydedilmeyeceği. Bu, kapsam dahilindeki her ad alanı için DOMXPath::registerNamespace() öğesini manuel olarak çağırmaya gerek kalmaması için kullanılabilir. Bir ad alanı öneki çakışması olduğunda, yalnızca en yakın soydan gelen ad alanı öneki kaydedilir.

Dönen Değerler

Mümkünse sonucu bir dizge orarak döndürür, değilse belirtilen XPath ifadesi ile eşleşen tüm düğümleri içeren bir DOMNodeList nesnesi döner.

ifade bozuksa ya da bağlamsal_düğüm geçersizse, DOMXPath::evaluate() false döndürür.

Örnekler

Örnek 1 - Tüm İngilizce kitapların sayısını döndürmek

<?php

$doc
= new DOMDocument;

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

$xpath = new DOMXPath($doc);

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

// sorgumuzu tbody düğümüne göre yapalım
$query = 'count(row/entry[. = "en"])';

$entries = $xpath->evaluate($query, $tbody);
echo
"$entries İngilizce kitap var.\n";

?>

Yukarıdaki örneğin çıktısı:

2 İngilizce kitap var.

Ayrıca Bakınız

add a note

User Contributed Notes 5 notes

up
4
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
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
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