xml解析之XPath表达式

 javax.xml.xpath (Java 2 Platform SE 6)

 

软件包 javax.xml.xpath 的描述

 

此包提供了用于 XPath 表达式的计算和访问计算环境的 object-model neutral API。

应用以下 XML 标准:


XPath 概述

XPath 语言提供了用于从 XML 文档选择节点的简单、简洁的语法。XPath 还提供了将 XML 文档对象模型(DOM)树中的节点转换为布尔值、double 值或字符串值的规则。XPath 是 W3C 定义的语言和正式的 W3C 推荐,W3C 拥有 XML Path Language (XPath) Version 1.0 规范。

XPath 诞生于 1999 年,作为对 XSLT 和 XPointer 语言的补充,但近来已成为流行的独立语言,因为单个 XPath 表达式可用于替代多行 DOM API 代码。

XPath 表达式

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

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

/foo/bar

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

<foo>
<bar/>
</foo>

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

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

特殊位置路径操作符 // 选择位于 XML 文档中任何深度的节点。以下示例选择所有 <bar> 元素,不管它们在文档中处于什么位置:

//bar

通配符 * 用于选择所有元素节点。以下示例选择 <foo> 元素的所有子元素:

/foo/*

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

位置路径描述
/foo/bar/@id 选择 <bar> 元素的属性 id
/foo/bar/text() 选择 <bar> 元素的文本节点。转义和非转义字符数据之间没有区别。
/foo/bar/comment() 选择 <bar> 元素中包含的所有注释节点。
/foo/bar/processing-instruction() 选择 <bar> 元素中包含的所有指令处理节点。

谓词允许修改 XPath 位置路径所选中的节点。谓词的形式为 [expression ] 。以下示例选择包含值为 trueinclude 属性的所有 <foo> 元素:

//foo[@include='true']

谓词可互相追加以进一步修改表达式,例如:

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

使用 XPath API

以下示例演示了使用 XPath API 来选择一个或多个来自 XML 文档的节点:

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

XPath 表达式和类型

虽然 XPath 表达式选择的是 XML 文档的节点,但 XPath API 允许将选中的节点组合到以下其他数据类型中:

  • 布尔值
  • 数字
  • 字符串

用于计算表示式的方法调用中的 QName 参数指定了所需的返回类型,其中方法调用要么是调用 XPathExpression.evalute(...) ,要么是调用 XPath.evaluate(...) 便捷方法之一。允许的 QName 值指定为 XPathConstants 类中的常量,它们是:

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

String 返回类型是从文本节点、注释节点或指令处理节点检索字符数据的便捷方法。当用于元素节点上时,返回子文本节点的值。

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

XPath 上下文

XPath 位置路径可以相对于文档中的特殊节点,称为 context 。考虑以下 XML 文档:

<widgets>
<widget>
<manufacturer/>
<dimensions/>
</widget>
</widgets>

可以通过以下 XPath API 代码选择 <widget> 元素:

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

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

通过引用 <widget> 元素,现在可以编写相对 XPath 表达式来选择 <manufacturer> 子元素:

XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "manufacturer";


Node manufacturerNode = (Node) xpath.evaluate(expression, widgetNode

, XPathConstants.NODE);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值