浏览器对XPath的支持

DOM Level 3 XPath

判定浏览器是否支持

let support = document.implementation.hasFeature("XPath","3.0")

此规范定义了很多类型,其中最重要的两个是XPathEvaluatorXPathResult

XPathEvaluator用于在特定上下文中求值XPath表达式。

  • createExpression(expression,nsresolver),用于根据XPath表达式及相应的命名空间计算得到一个XPathExpression。
  • createNSResolver(node),基于node的命名空间创建新的XPathNSResolver对象。当对使用名称空间的XML文档求值时,需要XPathNSResolver对象。
  • evaluate(expression, context,nsresolver,type,result),根据给定的上下文和命名空间对XPath进行求值。其他参数表示如何返回结果。

使用最频繁的是evaluate()。这个方法接收五个参数:XPath表达式、上下问节点、命名空间解析器、返回的结果类型和XPathResult对象。

如果结果是节点迭代器,无论有序还是无序,都必须使用iterateNext()方法获取结果中每个匹配的节点。

如果指定了快照结果类型,都必须使用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);
    }
}

单个节点结果

XPathResult.FIRST_ORDERED_NODE_TYPE结果类型返回匹配的第一个节点,可以通过结果singleNodeValue属性获取

let result = xmldom.evaluate("employee/name",xmldom.documentElement,null,
            XPathResult.FIRST_ORDERED_NODE_TYPE,null);
if (result!==null){
  console.log(result.singleNodeValue.tagName);
}

简单类型结果

如果至少有一个节点匹配XPath表达式,booleanValue就是true,否则为false

let result = xmldom.evaluate("employee/name",xmldom.documentElement,null,
        XPathResult.BOOLEAN_TYPE,null);
console.log(result.booleanValue)

NUMBER_TYPE输出匹配的节点数量

let result = xmldom.evaluate("employee/name",xmldom.documentElement,null,
          XPathResult.NUMBER_TYPE,null);
  console.log(result.numberValue)

STRING_TYPE匹配第一个元素中第一个文本节点包含的文本字符串。

let result = xmldom.evaluate("employee/name",xmldom.documentElement,null,
          XPathResult.STRING_TYPE,null);
  console.log(result.stringValue)

默认类型结果

ANY_TYPE类型让求值自动返回默认类型结果。

通常默认类型结果是布尔值、数值、字符串和无序节点迭代器。

let result =xmldom.evaluate("employee/name",xmldom.documentElement,null,
                  XPathResult.ANY_TYPE,null);
if(result!==null) {
  switch (result.resultType){
    case XPathResult.STRING_TYPE:break;
    case XPathResult.NUMBER_TYPE:break;
    case XPathResult.BOOLEAN_TYPE:break;
    case XPathResult.UNORDERED_NODE_ITERATOR_TYPE:break;
    default:break;
  }
}