试图决定哪一个更适合我的用例..。
在比较了这些方法的文档之后,我模糊的理解是evaluate返回一个类型化的结果,但是query没有。此外,query示例包括循环许多结果,但是evaluate示例假设一个类型的结果。
还是不太明智!有谁能解释一下(尽可能接近外行人的说法)你什么时候会使用其中一种?例如,上面提到的多重/单一结果是否总是如此?
发布于 2014-05-22 00:43:20
DOMXPath::query()只支持返回节点列表的表达式。DOMXPath::valid ()支持所有有效表达式。正式的方法也被命名为named ():http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
选择div://div//p中的所有div元素
选择当前文档:href中的a元素中的所有//a/@href属性
可以使用string()函数将节点列表的第一个元素转换为字符串。这将不适用于DOMXpath::query()。
选择文档的标题文本:string(/html/head/title)
还有其他函数和运算符将更改表达式的结果类型。但它始终是明确的。你将永远知道结果是什么类型。
发布于 2014-05-21 23:35:09
query将返回一个DOMNodeList,而不考虑实际的XPath表达式。这表明你不知道结果可能是什么。因此,您可以遍历列表,检查节点的节点类型,并根据类型执行一些操作。
但是query并不局限于这个用例。当你知道你会得到什么样的类型时,你仍然可以使用它。将来你想要达到的目标可能更容易读懂,因此维护起来也更容易。
另一方面,evaluate给出了您所选择的类型。正如例子指出的那样:
$xpath->evaluate("1 = 0"); // FALSE
$xpath->evaluate("string(1 = 0)"); // "false"实际上,选择属性//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 idhttps://stackoverflow.com/questions/23793816
复制相似问题