Package javax.xml.xpath
XPath API支持XML Path Language (XPath) Version 1.0
1. XPath概述
XPath语言提供了一种简单,简洁的语法,用于从XML文档中选择节点。 XPath还提供了将XML文档对象模型(DOM)树中的节点转换为布尔值,双精度值或字符串值的规则。 XPath是W3C定义的语言和官方的W3C推荐; W3C承载XML路径语言(XPath)版本1.0规范。
XPath在1999年开始作为XSLT和XPointer语言的补充,但最近作为独立语言变得流行,因为单个XPath表达式可用于替换许多行的DOM API代码。
2. 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] 。 以下示例选择包含值为true的include属性的所有<foo>元素: 
 
       
     //foo[@include='true']
  
       
      谓词可以相互附加以进一步细化表达式,例如:
 
       
     //foo[@include='true'][@mode='bar']
  
       
       
      3. XPath数据类型
当XPath表达式选择XML文档中的节点时,XPath API允许将选定的节点合并为以下数据类型之一:
-  
Boolean -  
Number -  
String 
3.1 QName类型
XPath API定义以下QName类型以表示XPath评估的返回类型: 
      -  
XPathConstants.NODESET -  
XPathConstants.NODE -  
XPathConstants.STRING -  
XPathConstants.BOOLEAN -  
XPathConstants.NUMBER 
 返回类型由用于计算表达式的方法调用中的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(...)方法评估表达式的结果将属于这些类型之一。 
       
      4. 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 Document。 以下代码演示了如何使用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
 
-  
      
接口摘要 接口 描述 XPath XPath提供对XPath评估环境和表达式的访问。XPathEvaluationResult<T> XPathEvaluationResult接口表示在特定节点的上下文中评估XPath表达式的结果。XPathExpression XPathExpression提供对已编译的XPath表达式的访问。XPathFunction XPathFunction提供对XPath功能的访问。XPathFunctionResolver XPathFunctionResolver提供对用户定义的一组XPathFunction的访问。XPathNodes XPathNodes表示由位置路径选择的一组节点,如 XML Path Language (XPath) Version 1.0, 3.3 Node-sets中所指定。XPathVariableResolver XPathVariableResolver提供对用户定义的XPath变量集的访问。 -  
      
类摘要 类 描述 XPathConstants XPath常量。XPathFactory XPathFactory实例可用于创建XPath对象。 -  
      
枚举摘要 Enum 描述 XPathEvaluationResult.XPathResultType XPathResultType表示XPath评估的可能返回类型。 -  
      
异常摘要 异常 描述 XPathException XPathException表示一般的XPath异常。XPathExpressionException XPathExpressionException表示XPath表达式中的错误。XPathFactoryConfigurationException XPathFactoryConfigurationException表示XPathFactory环境中的配置错误。XPathFunctionException XPathFunctionException表示XPath函数的错误。