a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 523|回复: 0

[专业语言] Java认证辅导之关于Java语言的XPathAPI(2)

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证辅导之关于Java语言的XPathAPI(2)
7 L( @9 ^! [4 R& y
! ~7 ?. c. p% U$ d/ k% [6 w. C但是虽然有很强的表达能力,XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言。有很多东西用 XPath 表达不出来,甚至有些查询也无法表达。比方说,XPath 不能查找国际标准图书编码(ISBN)检验码不匹配的所有图书,或者找出境外帐户数据库显示欠帐的所有作者。幸运的是,可以把 XPath 结合到 Java 程序中,这样就能发挥两者的优势了:Java 做 Java 所擅长的,XPath 做 XPath 所擅长的。+ X0 V* P  s: H
直到最近,Java 程序执行 XPath 查询所需要的应用程序编程接口(API)还因形形色色的 XPath 引擎而各不相同。Xalan 有一种 API,Saxon 使用另一种,其他引擎则使用其他的 API。这意味着代码往往把您限制到一种产品上。理想情况下,最好能够试验具有不同性能特点的各种引擎,而不会带来不适当的麻烦或者重新编写代码。
6 d8 g+ t; v! G1 ^  U8 l于是,Java 5 推出了 javax.xml.xpath 包,提供一个引擎和对象模型独立的 XPath 库。这个包也可用于 Java 1.3 及以后的版本,但需要单独安装 Java API for XML Processing (JAXP) 1.3。Xalan 2.7 和 Saxon 8 以及其他产品包含了这个库的实现。4 f4 G& m! X) C2 K+ o- N2 j1 S
一个简单的例子
& k! g- [" I; z1 ^8 E" A我将举例说明如何使用它。然后再讨论一些细节问题。假设要查询一个图书列表,寻找 Neal Stephenson 的著作。具体来说,这个图书列表的形式如 清单 2 所示:
1 [$ @, i% @/ q( I. e3 P清单 2. 包含图书信息的 XML 文档
$ i& E  l" T' ?& v& d# q% k6 O. _% M0 d' m+ k8 D
              Snow Crash         Neal Stephenson         Spectra         0553380958         14.95                   Burning Tower         Larry Niven         Jerry Pournelle         Pocket         0743416910         5.99                   Zodiac         Neal Stephenson         Spectra         0553573862         7.50            抽象工厂# \8 ~% p- ?; B9 n
XPathFactory 是一个抽象工厂。抽象工厂设计模式使得这一种 API 能够支持不同的对象模型,如 DOM、JDOM 和 XOM。为了选择不同的模型,需要向XPathFactory.newInstance() 方法传递标识对象模型的统一资源标识符(URI)。比如 http://xom.nu/ 可以选择 XOM。但实际上,到目前为止 DOM 是该 API 支持的惟一对象模型。
$ z0 p/ E- I- g- a( }2 l8 J' F查找所有图书的 XPath 查询非常简单://book[author="Neal Stephenson"]。为了找出这些图书的标题,只要增加一步,表达式就变成了 //book[author="Neal Stephenson"]/title。最后,真正需要的是title 元素的文本节点孩子。这就要求再增加一步,完整的表达式就是//book[author="Neal Stephenson"]/title/text()。
: \5 X, }! j/ [8 n! P0 z: ?# U" |现在我提供一个简单的程序,它从 Java 语言中执行这个查询,然后把找到的所有图书的标题打印出来。首先,需要将文档加载到一个 DOMDocument 对象中。为了简化起见,假设该文档在当前工作目录的 books.xml 文件中。下面的简单代码片段解析文档并建立对应的Document 对象:' [1 m, Y5 b: u; r9 T
. S. A* L( e6 P! ^( U$ G; x

1 l* K- v& g6 r3 y, pDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // never forget this! DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("books.xml"); 到目前为止,这仅仅是标准的 JAXP 和 DOM,没有什么新鲜的。
. i$ p/ C. T8 A0 m( Q9 r- T4 c接下来创建 XPathFactory:
3 U/ l0 e$ k  T' F3 z4 ^% C/ L- l* |  b, [5 L4 C
XPathFactory factory = XPathFactory.newInstance(); 然后使用这个工厂创建 XPath 对象:
  m. J7 v% V. M# J: e
, S* [% @8 s4 {- M6 n3 UXPath xpath = factory.newXPath(); XPath 对象编译 XPath 表达式:3 d9 K( c5 p7 ]1 B3 Z! K* R) U

! C! X- V6 G! O! V3 E! }( OPathExpression expr = xpath.compile("//book[author='Neal Stephenson']/title/text()");
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-27 06:46 , Processed in 0.195282 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表