javascript基础从小白到高手系列八:浏览器对XPath 的支持
XPath 是为了在DOM 文档中定位特定节点而创建的,因此它对XML 处理很重要。在DOM Level 3
之前,XPath 相关的API 没有被标准化。DOM Level 3 开始着手标准化XPath。很多浏览器实现了DOM
Level 3 XPath 标准,但IE 决定按照自己的方式实现。
DOM Level 3 XPath
DOM Level 3 XPath 规范定义了接口,用于在DOM 中求值XPath 表达式。要确定浏览器是否支持
DOM Level 3 XPath,可以使用以下代码:
let supportsXPath = document.implementation.hasFeature(“XPath”, “3.0”);
虽然这个规范定义了不少类型,但其中最重要的两个是XPathEvaluator 和XPathResult。
XPathEvaluator 用于在特定上下文中求值XPath 表达式,包含三个方法。
createExpression(expression, nsresolver),用于根据XPath 表达式及相应的命名空间
计算得到一个XPathExpression,XPathExpression 是查询的编译版本。这适合于同样的查
询要运行多次的情况。
createNSResolver(node),基于node 的命名空间创建新的XPathNSResolver 对象。当对
使用名称空间的XML 文档求值时,需要XPathNSResolver 对象。
evaluate(expression, context, nsresolver, type, result),根据给定的上下文和
命名空间对XPath 进行求值。其他参数表示如何返回结果。
Document 类型通常是通过XPathEvaluator 接口实现的,因此可以创建XPathEvaluator 的实
例,或使用Document 实例上的方法(包括XML 和HTML 文档)。
在上述三个方法中,使用最频繁的是evaluate()。这个方法接收五个参数:XPath 表达式、上下
文节点、命名空间解析器、返回的结果类型和XPathResult 对象(用于填充结果,通常是null,因
为结果也可能是函数值)。第三个参数,命名空间解析器,只在XML 代码使用XML 命名空间的情况下
有必要。如果没有使用命名空间,这个参数也应该是null。第四个参数要返回值的类型是如下10 个常
量值之一。
XPathResult.ANY_TYPE:返回适合XPath 表达式的数据类型。
XPathResult.NUMBER_TYPE:返回数值。
XPathResult.STRING_TYPE:返回字符串值。
XPathResult.BOOLEAN_TYPE:返回布尔值。
XPathResult.UNORDERED_NODE_ITERATOR_TYPE:返回匹配节点的集合,但集合中节点的顺
序可能与它们在文档中的顺序不一致。
XPathResult.ORDERED_NODE_ITERATOR_TYPE:返回匹配节点的集合,集合中节点的顺序与
它们在文档中的顺序一致。这是非常常用的结果类型。
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE:返回节点集合的快照,在文档外部捕获节
点,因此对文档的进一步修改不会影响该节点集合。集合中节点的顺序可能与它们在文档中的
顺序不一致。
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE:返回节点集合的快照,在文档外部捕获节点,
因此对文档的进一步修改不会影响这个节点集合。集合中节点的顺序与它们在文档中的顺序一致。
XPathResult.ANY_UNORDERED_NODE_TYPE:返回匹配节点的集合,但集合中节点的顺序可能
与它们在文档中的顺序不一致。
XPathResult.FIRST_ORDERED_NODE_TYPE:返回只有一个节点的节点集合,包含文档中第一
个匹配的节点。
指定的结果类型决定了如何获取结果的值。下面是一个典型的示例:
let result = xmldom.evaluate(“employee/name”, xmldom.documentElement, null,
XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
if (result !== null) {
let element = result.iterateNext();
while(element) {
console.log(element.tagName);
node = result.iterateNext();
}
}
这个例子使用了XPathResult.ORDERED_NODE_ITERATOR_TYPE 结果类型,也是最常用的类型。
如果没有节点匹配XPath 表达式,evaluate()方法返回null;否则,返回XPathResult 对象。返回
的XPathResult 对象上有相应的属性和方法用于获取特定类型的结果。如果结果是节点迭代器,无论有序还是无序,都必须使用iterateNext()方法获取结果中每个匹配的节点。在没有更多匹配节点时,
iterateNext()返回null。
如果指定了快照结果类型(无论有序还是无序),都必须使用snapshotItem()方法和snapshotLength
属性获取结果,如以下代码所示:
let result = xmldom.evaluate(“employee/name”, xmldom.documentElement, null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
if (result !== null) {
for (let i = 0, len=result.snapshotLength; i < len; i++) {
console.log(result.snapshotItem(i).tagName);
}
}
这个例子中,snapshotLength 返回快照中节点的数量,而snapshotItem()返回快照中给定位
置的节点(类似于NodeList 中的length 和item())。
原文地址:https://blog.csdn.net/2301_79516858/article/details/145189083
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!