首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOMXPath::query和DOMXPath::query之间有什么区别?

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

Stack Overflow用户
提问于 2014-05-21 21:08:04
回答 2查看 4.5K关注 0票数 12

试图决定哪一个更适合我的用例..。

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

还是不太明智!有谁能解释一下(尽可能接近外行人的说法)你什么时候会使用其中一种?例如,上面提到的多重/单一结果是否总是如此?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)

还有其他函数和运算符将更改表达式的结果类型。但它始终是明确的。你将永远知道结果是什么类型。

票数 11
EN

Stack Overflow用户

发布于 2014-05-21 23:35:09

query将返回一个DOMNodeList,而不考虑实际的XPath表达式。这表明你不知道结果可能是什么。因此,您可以遍历列表,检查节点的节点类型,并根据类型执行一些操作。

但是query并不局限于这个用例。当你知道你会得到什么样的类型时,你仍然可以使用它。将来你想要达到的目标可能更容易读懂,因此维护起来也更容易。

另一方面,evaluate给出了您所选择的类型。正如例子指出的那样:

代码语言:javascript
复制
$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相同的输出。

他的回答是对的,有些表达式不适用于query

代码语言:javascript
复制
$xpath->query("string(//div/@id)") // DOMNodeList of length 0
$xpath->evaluate("string(//div/@id)") // string with the found id
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23793816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档