Document: evaluate() 方法
语法
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
,链接到选定的节点。如果 result
为 null
,则它是一个新对象,否则它与作为 result
参数传递的对象相同。
示例
通过 XPath 查找所有 H2 标题
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 标签内,则可以使用以下方法:
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
搜索时。
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 表格仅在浏览器中加载