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)
还有其他函数和运算符将更改表达式的结果类型.但它总是毫不含糊.您将始终知道结果的类型.
query
DOMNodeList
无论您的实际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)
归档时间: |
|
查看次数: |
3286 次 |
最近记录: |