会计考友 发表于 2012-8-4 12:44:44

Java认证辅导之关于Java语言的XPathAPI(2)

Java认证辅导之关于Java语言的XPathAPI(2)

但是虽然有很强的表达能力,XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言。有很多东西用 XPath 表达不出来,甚至有些查询也无法表达。比方说,XPath 不能查找国际标准图书编码(ISBN)检验码不匹配的所有图书,或者找出境外帐户数据库显示欠帐的所有作者。幸运的是,可以把 XPath 结合到 Java 程序中,这样就能发挥两者的优势了:Java 做 Java 所擅长的,XPath 做 XPath 所擅长的。
直到最近,Java 程序执行 XPath 查询所需要的应用程序编程接口(API)还因形形色色的 XPath 引擎而各不相同。Xalan 有一种 API,Saxon 使用另一种,其他引擎则使用其他的 API。这意味着代码往往把您限制到一种产品上。理想情况下,最好能够试验具有不同性能特点的各种引擎,而不会带来不适当的麻烦或者重新编写代码。
于是,Java 5 推出了 javax.xml.xpath 包,提供一个引擎和对象模型独立的 XPath 库。这个包也可用于 Java 1.3 及以后的版本,但需要单独安装 Java API for XML Processing (JAXP) 1.3。Xalan 2.7 和 Saxon 8 以及其他产品包含了这个库的实现。
一个简单的例子
我将举例说明如何使用它。然后再讨论一些细节问题。假设要查询一个图书列表,寻找 Neal Stephenson 的著作。具体来说,这个图书列表的形式如 清单 2 所示:
清单 2. 包含图书信息的 XML 文档

            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            抽象工厂
XPathFactory 是一个抽象工厂。抽象工厂设计模式使得这一种 API 能够支持不同的对象模型,如 DOM、JDOM 和 XOM。为了选择不同的模型,需要向XPathFactory.newInstance() 方法传递标识对象模型的统一资源标识符(URI)。比如 http://xom.nu/ 可以选择 XOM。但实际上,到目前为止 DOM 是该 API 支持的惟一对象模型。
查找所有图书的 XPath 查询非常简单://book。为了找出这些图书的标题,只要增加一步,表达式就变成了 //book/title。最后,真正需要的是title 元素的文本节点孩子。这就要求再增加一步,完整的表达式就是//book/title/text()。
现在我提供一个简单的程序,它从 Java 语言中执行这个查询,然后把找到的所有图书的标题打印出来。首先,需要将文档加载到一个 DOMDocument 对象中。为了简化起见,假设该文档在当前工作目录的 books.xml 文件中。下面的简单代码片段解析文档并建立对应的Document 对象:


DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); // never forget this! DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("books.xml"); 到目前为止,这仅仅是标准的 JAXP 和 DOM,没有什么新鲜的。
接下来创建 XPathFactory:

XPathFactory factory = XPathFactory.newInstance(); 然后使用这个工厂创建 XPath 对象:

XPath xpath = factory.newXPath(); XPath 对象编译 XPath 表达式:

PathExpression expr = xpath.compile("//book/title/text()");
页: [1]
查看完整版本: Java认证辅导之关于Java语言的XPathAPI(2)