如何在xpath中使用sum-function?

时间:2014-04-11 17:40:21

标签: php xml simplexml

sum中的xpath - 函数:

<list>
    <a>1</a>
    <a>3</a>
    <a>4</a>
</list>

现在使用SimpleXml ...

var_dump($xml->xpath("sum(/list/a)"));

提供NULL而不是8

这里有什么问题?

看它不起作用:https://eval.in/135558

编辑:我已为SimpleXml使用此解决方法来避免迭代:

$sum = $xml->xpath("/list/a"); 
$sum = array_sum(array_walk("intval", $sum));

2 个答案:

答案 0 :(得分:3)

如果您正在使用SimpleXML,则必须手动执行此操作。但是,您可以使用DOMDocument来实现此目的。只需使用evaluate()方法来评估XPath表达式:

$dom = new DOMDocument;
$dom->loadXML($xml); // $xml is the XML string

$xpath = new DOMXPath($dom);
$sum = (int) $xpath->evaluate('sum(/list/a)'); // => 8

Demo


SimpleXML解决方案:

$xml = simplexml_load_string($xml);
$sum = 0;

foreach ($xml->a as $node) {
    $sum += (int) $node;
}

echo $sum; // => 8

Demo

答案 1 :(得分:1)

在此使用DOMXPath::evaluate()

$str = <<<XML
<list>
    <a>1</a>
    <a>3</a>
    <a>4</a>
</list>
XML;

$output = new SimpleXMLElement($str);
$doc = new DOMDocument();
$doc->loadXML($str);

$selector = new DOMXPath($doc);

var_dump($selector->evaluate('sum(//list/a/text())'));
// double(8)

旁注:它会返回double而不是integer。这首先可能会令人惊讶。