关于php:DOMXPath :: evaluate和DOMXPath :: query有什么区别?

What is the difference between DOMXPath::evaluate and DOMXPath::query?

尝试确定哪个更适合我的用例...

在比较了这些方法的文档之后,我模糊的理解是evaluate返回键入的结果,但query不会。此外,query示例包括循环遍历许多结果,但是evaluate示例假定单个类型的结果。

还是不多聪明!任何人都可以解释(尽可能接近外行的用语)何时使用一种或另一种-例如上面提到的多个/单个结果是否总是这样?


DOMXPath :: query()仅支持返回节点列表的表达式。 DOMXPath :: evaluate()支持所有有效的表达式。官方方法也命名为Evaluate():http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator

选择div中的所有p元素://div//p

在当前文档的a元素中选择所有href属性://a/@href

您可以使用string()函数将节点列表的第一个元素转换为字符串。这不适用于DOMXpath :: query()。

选择文档的标题文本:string(/html/head/title)

还有其他函数和运算符将更改表达式的结果类型。但这始终是明确的。您将始终知道结果是什么类型。


query将返回DOMNodeList,而不管您的实际XPath表达式如何。这表明您不知道结果可能是什么。因此,您可以遍历列表并检查节点的节点类型,然后根据该类型执行某些操作。

但是query不限于此用例。当您知道将要获得的类型时,仍然可以使用它。将来可能会更容易阅读您想要实现的目标,因此更易于维护。

另一方面,

evaluate会为您提供您所选择的类型。如示例所示:

1
2
$xpath->evaluate("1 = 0"); // FALSE
$xpath->evaluate("string(1 = 0)"); //"false"

事实证明,选择属性//div/@id或文本节点//div/text()仍会产生DOMNodeList而不是字符串。因此,潜在的用例是有限的。您必须将它们包含在stringstring(//div/@id)或文本节点string(//div/text())中。

evaluate的主要优点是您可以用更少的代码行从DOMDocument中获取字符串。否则,它将产生与query相同的输出。

ThW的答案是正确的,即某些表达式不适用于query

1
2
$xpath->query("string(//div/@id)") // DOMNodeList of length 0
$xpath->evaluate("string(//div/@id)") // string with the found id