a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 597|回复: 0

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证辅导之关于Java语言的XPathAPI(2)% e, J2 N3 v5 N& E% U
( c/ M9 C8 d3 O, w
但是虽然有很强的表达能力,XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言。有很多东西用 XPath 表达不出来,甚至有些查询也无法表达。比方说,XPath 不能查找国际标准图书编码(ISBN)检验码不匹配的所有图书,或者找出境外帐户数据库显示欠帐的所有作者。幸运的是,可以把 XPath 结合到 Java 程序中,这样就能发挥两者的优势了:Java 做 Java 所擅长的,XPath 做 XPath 所擅长的。
6 K5 {; X5 o! X1 T8 q5 U直到最近,Java 程序执行 XPath 查询所需要的应用程序编程接口(API)还因形形色色的 XPath 引擎而各不相同。Xalan 有一种 API,Saxon 使用另一种,其他引擎则使用其他的 API。这意味着代码往往把您限制到一种产品上。理想情况下,最好能够试验具有不同性能特点的各种引擎,而不会带来不适当的麻烦或者重新编写代码。2 k* M7 J; T% V3 Z
于是,Java 5 推出了 javax.xml.xpath 包,提供一个引擎和对象模型独立的 XPath 库。这个包也可用于 Java 1.3 及以后的版本,但需要单独安装 Java API for XML Processing (JAXP) 1.3。Xalan 2.7 和 Saxon 8 以及其他产品包含了这个库的实现。
7 F. @8 e5 ~# O* O" |一个简单的例子& p8 O% T8 m& H3 [! h
我将举例说明如何使用它。然后再讨论一些细节问题。假设要查询一个图书列表,寻找 Neal Stephenson 的著作。具体来说,这个图书列表的形式如 清单 2 所示:6 y( F9 ^% ?# ^% N4 F
清单 2. 包含图书信息的 XML 文档
4 R. d! _% l0 p" F
" `* ?/ n: H9 n* c              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            抽象工厂
0 w; R' p- w: d+ oXPathFactory 是一个抽象工厂。抽象工厂设计模式使得这一种 API 能够支持不同的对象模型,如 DOM、JDOM 和 XOM。为了选择不同的模型,需要向XPathFactory.newInstance() 方法传递标识对象模型的统一资源标识符(URI)。比如 http://xom.nu/ 可以选择 XOM。但实际上,到目前为止 DOM 是该 API 支持的惟一对象模型。8 b2 P, a! k1 ]6 Z
查找所有图书的 XPath 查询非常简单://book[author="Neal Stephenson"]。为了找出这些图书的标题,只要增加一步,表达式就变成了 //book[author="Neal Stephenson"]/title。最后,真正需要的是title 元素的文本节点孩子。这就要求再增加一步,完整的表达式就是//book[author="Neal Stephenson"]/title/text()。
  u' h; P, v( _( a+ e现在我提供一个简单的程序,它从 Java 语言中执行这个查询,然后把找到的所有图书的标题打印出来。首先,需要将文档加载到一个 DOMDocument 对象中。为了简化起见,假设该文档在当前工作目录的 books.xml 文件中。下面的简单代码片段解析文档并建立对应的Document 对象:
+ ]/ ?6 H; h# G% T6 S
# z& c, j, c- {+ I* A2 i5 }/ h6 f# x$ @
) P* g, M7 j6 Q! _( f0 fDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // never forget this! DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("books.xml"); 到目前为止,这仅仅是标准的 JAXP 和 DOM,没有什么新鲜的。
, \. m+ e' t7 x3 H. P! H接下来创建 XPathFactory:
/ Z  h' ^( ]' r) m* S* W7 ?4 a+ A# `  h3 }0 I8 l0 h, v. o
XPathFactory factory = XPathFactory.newInstance(); 然后使用这个工厂创建 XPath 对象:
* C/ p( Z8 e1 a4 p
* K. r! G3 l. F9 vXPath xpath = factory.newXPath(); XPath 对象编译 XPath 表达式:( j; I; M" {, a" ], h! {3 n

, M- x+ P1 R' }* R; k' `PathExpression expr = xpath.compile("//book[author='Neal Stephenson']/title/text()");
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-27 19:44 , Processed in 0.414139 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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