Module  java.xml

Package javax.xml.xpath

提供用于评估XPath表达式和访问评估环境的对象模型中性 API。

XPath API支持XML Path Language (XPath) Version 1.0


XPath概述

XPath语言提供了从XML文档中选择节点的简单,简洁的语法。 XPath还提供了将XML文档对象模型(DOM)树中的节点转换为布尔值,双精度值或字符串值的规则。 XPath是一种W3C定义的语言和官方的W3C建议; W3C承载XML Path Language(XPath)1.0版规范。

XPath在1999年开始生活,作为XSLT和XPointer语言的补充,但最近更受欢迎作为独立语言,因为单个XPath表达式可用于替换多行DOM API代码。

XPath表达式

XPath 表达式位置路径和一个或多个可选谓词组成 表达式还可以包括XPath变量。

以下是一个简单的XPath表达式的例子:

     /foo/bar
 

此示例将在XML文档中选择<bar>元素,如下所示:

     <foo>
         <bar/>
     </foo>
 

表达式/foo/bar是位置路径的示例。 虽然XPath位置路径类似于Unix风格的文件系统路径,但一个重要的区别是XPath表达式返回与表达式匹配的所有节点。 因此,所有三个<bar>以下文档中的元素将被选择/foo/bar表达:

     <foo>
         <bar/>
         <bar/>
         <bar/>
     </foo>
 

特殊位置路径运算符( // )选择XML文档中任意深度的节点。 以下示例选择所有<bar>元素,而不管其在文档中的位置如何:

     //bar
 

通配符运算符*导致所有元素节点被选中。 以下示例选择<foo>元素的所有子元素:

     /foo/*
 

除了元素节点之外,XPath位置路径还可以寻址属性节点,文本节点,注释节点和处理指令节点。 下表给出了每个节点类型的位置路径示例:

Examples of Location Path Location Path Description /foo/bar/@id Selects the attribute id of the <bar> element /foo/bar/text() Selects the text nodes of the <bar> element. No distinction is made between escaped and non-escaped character data. /foo/bar/comment() Selects all comment nodes contained in the <bar> element. /foo/bar/processing-instruction() Selects all processing-instruction nodes contained in the <bar> element.

谓词允许精简由XPath位置路径选择的节点。 谓词的格式为[expression] 以下示例选择所有包含include属性的<foo>元素,值为true

     //foo[@include='true']
 

谓词可以彼此附加以进一步细化表达,例如:

     //foo[@include='true'][@mode='bar']
 

XPath数据类型

虽然XPath表达式选择XML文档中的节点,但XPath API允许所选节点合并成以下数据类型之一:

  • Boolean
  • Number
  • String

3.1 QName类型

XPath API定义了以下QName类型以表示XPath评估的返回类型:

返回类型由方法调用中用于评估表达式的QName参数指定,该表达式是调用XPathExpression.evalute(...)XPath.evaluate(...)方法。

当请求Boolean返回类型时,如果选择了一个或多个节点,则返回Boolean.TRUE ; 否则返回Boolean.FALSE

String返回类型是从文本节点,属性节点,注释节点或处理指令节点检索字符数据的便利。 当在元素节点上使用时,返回子文本节点的值。

Number返回类型尝试将节点的文本合并为double数据类型。

3.2类型

除了QName类型之外,XPath API还支持通过XPathExpression.evaluteExpression(...)XPath.evaluateExpression(...)方法使用类类型。 XPath数据类型映射到Class类型,如下所示:
  • Boolean - Boolean.class
  • Number - Number.class
  • String - String.class
  • Nodeset - XPathNodes.class
  • Node - Node.class

Number的子类型仅支持Double,Integer和Long。

3.3枚举类型

枚举类型在XPathEvaluationResult.XPathResultType中定义,提供上述QName和Class类型之间的映射。 使用XPathExpression.evaluteExpression(...)XPath.evaluateExpression(...)方法评估表达式的结果将是这些类型之一。

XPath上下文

XPath位置路径可能相对于文档中的特定节点,称为context 一个上下文包括:

  • 一个节点(上下文节点)
  • 一对非零正整数(上下文位置和上下文大小)
  • 一组变量绑定
  • 一个函数库
  • 表达式的范围中的一组命名空间声明

它是一个XML文档树,表示为节点的层次结构,例如在JDK实现中为Node

5.使用XPath API

考虑以下XML文档:
 <widgets>
 <widget>
 <manufacturer/>
 <dimensions/>
 </widget>
 </widgets>
 

可以通过以下过程选择<widget>元素:

     // parse the XML as a W3C Document
     DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
     Document document = builder.parse(new File("/widgets.xml"));

     //Get an XPath object and evaluate the expression
     XPath xpath = XPathFactory.newInstance().newXPath();
     String expression = "/widgets/widget";
     Node widgetNode = (Node) xpath.evaluate(expression, document, XPathConstants.NODE);

     //or using the evaluateExpression method
     Node widgetNode = xpath.evaluateExpression(expression, document, Node.class);
 

通过参考<widget>元素,可以写入一个相对的XPath表达式来选择<manufacturer>子元素:

     XPath xpath = XPathFactory.newInstance().newXPath();
     String expression = "manufacturer";
     Node manufacturerNode = (Node) xpath.evaluate(expression, widgetNode, XPathConstants.NODE);

     //or using the evaluateExpression method
     Node manufacturerNode = xpath.evaluateExpression(expression, widgetNode, Node.class);
 

在上述示例中,XML文件在传递到XPath API之前被读入DOM文档。 以下代码演示了如何使用InputSource将其保留到XPath实现来处理它:

     XPath xpath = XPathFactory.newInstance().newXPath();
     String expression = "/widgets/widget";
     InputSource inputSource = new InputSource("widgets.xml");
     NodeList nodes = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);

     //or using the evaluateExpression method
     XPathNodes nodes = xpath.evaluate(expression, inputSource, XPathNodes.class);
 

在上述情况下,预期结果的类型是已知的。 如果结果类型未知或任何类型,则XPathEvaluationResult可用于确定返回类型。 以下代码演示了以下用法:

     XPathEvaluationResult<?> result = xpath.evaluateExpression(expression, document);
     switch (result.type()) {
         case NODESET:
             XPathNodes nodes = (XPathNodes)result.value();
             ...
             break;
     }
 

XPath 1.0 Number数据类型被定义为double。 但是,XPath规范还提供了返回Integer类型的函数。 为了方便这种操作,XPath API允许在evaluateExpression使用Integer和Long,如下面的代码:

     int count = xpath.evaluate("count(/widgets/widget)", document, Integer.class);
 
从以下版本开始:
1.5