Document: evaluate() 方法

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

XPath 表达式可以应用于 HTML 和 XML 文档。

语法

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

参数

xpathExpression

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

contextNode

查询的 上下文节点(参见 XPath 规范)。通常将 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 搜索时。

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

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅