DOMXPath :: evaluate和DOMXPath :: query之间有什么区别?

时间:2014-05-21 21:08:05

标签: php dom xpath domxpath evaluate

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

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

仍然没有多大的明智!当你使用其中一个时,任何人都可以解释(尽可能接近外行人的条款) - 例如上面提到的多个/单个结果总是如此吗?

2 个答案:

答案 0 :(得分:9)

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

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

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

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

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

还有其他函数和运算符将更改表达式的结果类型。但它总是毫不含糊。您将始终知道结果的类型。

答案 1 :(得分:5)

无论您的实际XPath表达如何,

query都会返回DOMNodeList。这表明您不知道结果可能是什么。因此,您可以遍历列表并检查节点的node type并根据类型执行某些操作。

query并不仅限于此用例。当你知道你会得到什么类型时,你仍然可以使用它。它将来可能更具可读性,因此更易于维护。

另一方面,

evaluate可以为您提供所选的类型。如例子所示:

$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's answer是正确的,某些表达式不适用于query

$xpath->query("string(//div/@id)") // DOMNodeList of length 0
$xpath->evaluate("string(//div/@id)") // string with the found id
相关问题