文档:evaluate() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

Document 接口的 evaluate() 方法根据参数中给定的 XPath 表达式选择元素。

XPath 表达式可以在 HTML 和 XML 文档上进行评估。

语法

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

参数

xpathExpression

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

contextNode

查询的上下文节点。通常将 document 作为上下文节点。

namespaceResolver

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

resultType

一个整数,对应于要返回的 XPathResult 类型。以下值是可能的:

ANY_TYPE (0)

给定表达式自然产生的任何类型。

NUMBER_TYPE (1)

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

STRING_TYPE (2)

包含单个字符串的结果集。

BOOLEAN_TYPE (3)

包含单个布尔值的结果集。例如,在使用 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

返回值

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

示例

通过 XPath 查找所有 H2 标题

js
const headings = document.evaluate(
  "/html/body//h2",
  document,
  null,
  XPathResult.ANY_TYPE,
  null,
);
/* Search the document for all h2 elements.
 * The result will likely be an unordered node iterator. */
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); // Alerts the text of all h2 elements

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

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

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

请注意,在上面的示例中,document.body 已被用作上下文而不是 document,因此 xpath 从 body 元素开始。(在此示例中,“.”很重要,它表示查询应该从上下文节点 document.body 开始。如果省略“.”(只留下 //h2),查询将从根节点 (html) 开始,这将更浪费。)

有关更多信息,请参阅JavaScript 中使用 XPath 的介绍

按 xml:id 获取元素

此函数是 Document.getElementById() 的替代品,用于您需要按 xml:id 而不是 id 进行搜索的情况。

js
function getElementByIdWrapper(xmlDoc, id) {
  return xmlDoc.evaluate(
    `//*[@xml:id="${id}"]`,
    xmlDoc,
    () => "http://www.w3.org/XML/1998/namespace",
    XPathResult.FIRST_ORDERED_NODE_TYPE,
    null,
  ).singleNodeValue;
}

规范

规范
DOM
# dom-xpathevaluatorbase-evaluate

浏览器兼容性

另见