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

Ste*_*ers 7 php xpath dom evaluate domxpath

试着决定哪个更适合我的用例......

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

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

ThW*_*ThW 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)

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


Art*_* B. 5

queryDOMNodeList无论您的实际XPath表达式如何,都将返回.这表明您不知道结果可能是什么.因此,您可以迭代列表并检查节点的节点类型,并根据类型执行某些操作.

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

evaluate另一方面,为您提供您选择的类型.如例子所示:

$xpath->evaluate("1 = 0"); // FALSE
$xpath->evaluate("string(1 = 0)"); // "false"
Run Code Online (Sandbox Code Playgroud)

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

主要优点evaluate是你可以DOMDocument用更少的代码行来获取字符串.否则它将产生相同的输出query.

我的答案是正确的,有些表达式不适用于query:

$xpath->query("string(//div/@id)") // DOMNodeList of length 0
$xpath->evaluate("string(//div/@id)") // string with the found id
Run Code Online (Sandbox Code Playgroud)