Web

JS Document.evaluate()的使用

YunAdmin
2024-04-12 / 3 评论 / 199 阅读 / 正在检测是否收录...

Document 接口的 evaluate() 方法根据参数中给出的 XPath 表达式选择元素。
XPath 表达式可以在 HTML 和 XML 文档上进行计算。

Syntax

js

evaluate(xpathExpression, contextNode, namespaceResolver, resultType, result)

Parameters

xpathExpression
 表示要评估的 xpath 的字符串。

contextNode
 查询的上下文节点(请参阅 XPath specificatio )。通常将 document 作为上下文节点传递。

namespaceResolver
 将传递任何命名空间前缀的函数,并应返回表示与该前缀关联的命名空间 URI 的字符串。它将用于解析 xpath 本身内的前缀,以便它们可以与文档匹配。 null 值对于 HTML 文档或不使用命名空间前缀时很常见。

resultType
 与要返回的结果 XPathResult 的类型相对应的整数。以下值是可能的:
 ANY_TYPE (0)
  无论什么类型都会自然地由给定的表达式产生。

 NUMBER_TYPE (1)
  包含单个数字的结果集。例如,在使用 count() 函数的 xpath 表达式中很有用。

 STRING_TYPE (2)
  包含单个字符串的结果集。

 BOOLEAN_TYPE (3)
  包含单个 boolean 值的结果集。例如,使用 not() 函数的 xpath 表达式很有用。

 UNORDERED_NODE_ITERATOR_TYPE (4)
  包含与表达式匹配的所有节点的结果集。结果集中的节点不一定与它们在文档中出现的顺序相同。

  注意:此类型的结果包含对文档中节点的引用。修改节点将使迭代器失效。修改节点后,尝试迭代结果将导致错误。

 ORDERED_NODE_ITERATOR_TYPE (5)
  包含与表达式匹配的所有节点的结果集。结果集中的节点的顺序与它们在文档中出现的顺序相同。

  注意:此类型的结果包含对文档中节点的引用。修改节点将使迭代器失效。修改节点后,尝试迭代结果将导致错误。

 UNORDERED_NODE_SNAPSHOT_TYPE (6)
  包含与表达式匹配的所有节点的快照的结果集。结果集中的节点不一定与它们在文档中出现的顺序相同。

  注意:这种类型的结果是快照,本质上是匹配节点的列表。您可以通过更改快照节点来更改文档。修改文档不会使快照失效;但是,如果文档发生更改,快照可能与文档的当前状态不对应,因为节点可能已移动、更改、添加或删除。

 ORDERED_NODE_SNAPSHOT_TYPE (7)
  包含与表达式匹配的所有节点的快照的结果集。结果集中的节点的顺序与它们在文档中出现的顺序相同。

  注意:这种类型的结果是快照,本质上是匹配节点的列表。您可以通过更改快照节点来更改文档。修改文档不会使快照失效;但是,如果文档发生更改,快照可能与文档的当前状态不对应,因为节点可能已移动、更改、添加或删除。

 ANY_UNORDERED_NODE_TYPE (8)
  包含与表达式匹配的任何单个节点的结果集。该节点不一定是文档中与表达式匹配的第一个节点。

 FIRST_ORDERED_NODE_TYPE (9)
  包含文档中与表达式匹配的第一个节点的结果集。

result
 用于获取结果的现有 XPathResult 。如果设置为 null 该方法将创建并返回一个新的 XPathResult

Return value

链接到所选节点的 XPathResult 。如果 resultnull ,则它是一个新对象,如果不是,则它与作为 result 参数传递的对象相同

Examples

js

const headings = document.evaluate(
  "/html/body//h2",
  document,
  null,
  XPathResult.ANY_TYPE,
  null,
);
/* 在文档中搜索所有 h2 元素。* 结果可能是一个无序的节点迭代器。*/
let thisHeading = headings.iterateNext();
let alertText = "Level 2 headings in this document are:\n";
while (thisHeading) {
  alertText += `${thisHeading.textContent}\n`;
  thisHeading = headings.iterateNext();
}
alert(alertText); // 提醒所有 h2 元素的文本

请注意,在上面的示例中,更详细的 xpath 优于常见的快捷方式(例如 //h2 )。一般来说,如上例所示,更具体的 xpath 选择器通常会带来显着的性能改进,尤其是在非常大的文档上。这是因为评估查询所花费的时间不会浪费时间访问不必要的节点。使用 // 通常很慢,因为它会访问根节点和所有子节点中的每个节点以查找可能的匹配项。

通过仔细使用上下文参数可以实现进一步的优化。例如,如果您知道要查找的内容位于 body 标记内的某个位置,则可以使用以下内容:

js

document.evaluate(".//h2", document.body, null, XPathResult.ANY_TYPE, null);

请注意,上面使用 document.body 而不是 document 作为上下文,因此 xpath 从 body 元素开始。(在此示例中, "." 非常重要,它表明查询应从上下文节点 document.body 开始。如果省略 "." (留下 //h2 ),则查询将从根节点 ( html ) 开始,这会更有效。浪费。)

请参阅 Introduction to using XPath in JavaScript 了解更多信息。

Specifications

原文出处:https://runebook.dev/zh/docs/dom/document/evaluate#xpathexpression

0

评论 (3)

取消
  1. 头像
    qzdvyexhim
    Windows 10 · Google Chrome

    ?励志类评语?

    回复
  2. 头像
    pqoltpdggn
    Windows 10 · Google Chrome

    情感表达稍显含蓄,可适当强化渲染。

    回复
  3. 头像
    wshodajcdg
    Windows 10 · Google Chrome

    文章的叙述风格独特,用词精准,让人回味无穷。

    回复