[英]What is the difference between DOMXPath::evaluate and DOMXPath::query?
DOMXPath :: query()仅支持返回节点列表的表达式。 DOMXPath :: evaluate()支持所有有效表达式。 官方方法也命名为evaluate(): http : //www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathEvaluator
选择div
: //div//p
所有p
元素
选择所有href
的属性, a
元素在当前文档: //a/@href
您可以使用string()
函数将节点列表的第一个元素强制转换为字符串。 这不适用于DOMXpath :: query()。
选择文档的标题文本: string(/html/head/title)
还有其他函数和运算符将更改表达式的结果类型。 但它总是毫不含糊。 您将始终知道结果的类型。
无论您的实际XPath表达式如何, query
都将返回DOMNodeList
。 这表明您不知道结果可能是什么。 因此,您可以迭代列表并检查节点的节点类型 ,并根据类型执行某些操作。
但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 id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.