以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 其他W3C规范 』  (http://bbs.xml.org.cn/list.asp?boardid=25)
----  使用 XAPI 管理 XML 集合  (http://bbs.xml.org.cn/dispbbs.asp?boardid=25&rootid=&id=15009)


--  作者:oceans
--  发布时间:3/3/2005 3:22:00 PM

--  使用 XAPI 管理 XML 集合
喜欢的编程语言中使用 XML 数据库应用程序编程接口
级别: 初级

Uche Ogbuji (uche.ogbuji@fourthought.com)
首席顾问, Fourthought, Inc.
2005 年 1 月

XML 存储库是 XML 文档这一概念的简单扩展,需要调用一个简单的 API 来实现访问和操纵。DOM 和 XPath 这类技术的粒度太小,而 XQuery 对于某些需要来说又太复杂。于是,XML 存储库的一帮实现者们走到了一起(称为 XML:DB),来共同开发诸如 API 这样的规范,结果就产生了 XML 数据库应用程序编程接口(Application Programming Interface for XML Databases,XAPI)。Uche Ogbuji 将在本文中介绍 XAPI。
在人们开始思考如何使用 XML 的时候,最先想到的问题之一是“如果有很多相关的 XML 文件,那么如何用一个系统来管理它们,在需要的时候能够单独控制每个文件,同时又能跨文件访问和管理?”。在实践方面提供部分答案的系统称为 XML 存储库。XML 存储库支持 XML 文档集合,并为内容的访问和操纵提供了持久存储和服务(可以是主流的 Web 服务,也可采用其他形式)。一旦建立了存储库,就可能需要对数据执行特殊的或者程序性的查询,于是早期 XML 数据库、服务器框架和程序语言接口(商业以及开放源代码)的开发人员提供了各种用于数据访问的专有接口。很快,与 XML 开发的很多领域一样,又出现了一个非正式的小组来编写用于 XML 存储库 API 的公共规范,这就是 XML:DB 小组(请参阅 参考资料)。

XML:DB 小组甚至比最不正规的组织还要松散,他们以非常粗糙的方式开发了自己的规范。尽管如此,他们还是提出了几个非常有影响而且被广泛实现的规范。XUpdate(请参阅 参考资料)可能是最知名的一个例子,而另一项最重要的成就则是 XML 数据库应用程序编程接口(XAPI)。用 XML:DB 自己的话来说(摘自 XAPI 规范):

XML:DB API [XAPI] 是为了支持 XML 数据库的公共访问机制而设计的。使用这种 API 可以构造应用程序存储、检索、修改和查询保存在 XML 数据库中的数据。这些设施可用于为任何宣称符合 XML:DB API 的 XML 数据库创建应用程序。一般而言,可以认为这种 API 相当于 ODBC、JDBC 或 Perl[以及 Python] DBI 这类技术。
本文将介绍 XAPI 和类似的规范,并对它们加以比较。

属于谁的领域?
上面的描述中反复提到了“XML”、“API”和“查询”这些词,您可能会问“为何不用 DOM、XQuery 这类技术呢?”。XAPI 巧妙地在这些广为人知的规范的空隙之间扎了根。DOM 专注于单个文档的节点级访问。XPath 通常也用于单个文档,虽然从技术上讲,它可以处理任何 XML 节点林,林是树(在计算机科学中指的是有向无环图)的集合,XSLT 是一种 XPath 宿主语言,它利用了这一差别来允许 XPath 处理多个源文档的内容(得益于 XSLT 函数 document())。后面将看到 XAPI 也利用了 XPath 的灵活性。

XQuery 完全是为了支持跨越多个文档的聚合而设计的,但它的基本方法是为查询的抽象数据定义非常严格的数据模型和语义。 XQuery 的设计考虑了访问关系数据库和对象数据库这类遗留数据存储,结果其抽象性和复杂性使其完全不同于流行的 XML 存储库,后者常常是纯文本或者简单的散列数据库形式的 XML 集合。因此从本质上说,XQuery 提供了如何访问 XML 数据的所有概念的微积分,还需要针对基本 XML 集合的简单算术,突出 XML 文档中的类文件系统层次结构,而没有太多的概念负担。也可以这样比较,XQuery 就像是该段的企业 DBMS,功能完备,价格也高;而 XAPI 更像是处理 UNIX 文件的 GNU 工具程序 —— 强调输入和输出文本的管道,每个处理阶段只有非常简单的操作。两者不一定互相排斥,事实上有些存储库同时实现了 XAPI 和 XQuery。

具体细节
XAPI 是为理解和实现模块化而设计的。与 DOM 一样,XAPI 也被分解成模块,为了保持语言独立性,每个模块都用接口定义语言(Interface Definition Language,IDL)定义,虽然这样做表现出对强类型、面向对象的偏好,不一定适合所有的语言。同样与 DOM 类似的是,XAPI 模块也组织成符合级别:最小符合级、核心级 0、核心级 1。

最小符合级定义了基本存储库特性的接口,如 Resource —— 数据的基本单位(通常是单个文档)—— 和 Collection —— 表示 Resource 集合(通常是某种文件夹或者容器)。此外,Service 针对查询和管理任务提供了 Collection 的扩展,Database 抽象了到特定存储库的连接,ResourceIterator 和 ResourceSet 一般表示查询的结果集。这个符合级别严格以抽象对象作为资源的内容,但是支持可扩展类型和资源标识符的概念。

核心级 0 精化了资源这个抽象概念,增加了 XML 的具体特性。它允许您将 XMLResource 的内容作为 DOM 节点(方法 getContentAsDOM())或者一系列 SAX 事件(方法 getContentAsSAX())来获得。与此类似,核心级 0 也包括修改 XML 内容的方法,以及用于定义为(非 XML)字节流的内容的接口(BinaryResource)。

核心级 1 建立在其他级别的基础上,为一般查询和操作服务提供了以下接口:

XPathQueryService:允许使用 XPath 查询集合或资源,包括用于名称空间映射和查询执行的方法。
XUpdateQueryService:允许使用 XUpdate 修改集合或资源。
CollectionManagementService:添加或删除集合(类似于“创建目录”和“删除目录”)。
TransactionService:在服务中定义事务上下文,允许在同时操作多项任务时清除数据操作。
一个简单的例子
清单 1 是摘自 XAPI 用例的一个简单 Java 程序片段,其中使用了所有三个 XAPI 级别。它从电影数据库中查询片名为“Music Man”的影片。

清单 1. 电影数据库的简单查询

import org.xmldb.api.base.*;
import org.xmldb.api.modules.*;
import org.xmldb.api.*;

/**
* Simple XML:DB API example to query the database.
*/
public class Example1 {
   public static void main(String[] args) throws Exception {
      Collection col = null;
      try {
         /* Section A */
         String driver = "org.vendorx.xmldb.DatabaseImpl";
         Class c = Class.forName(driver);
         
         Database database = (Database) c.newInstance();
         DatabaseManager.registerDatabase(database);
         col =
            DatabaseManager.getCollection("xmldb:vendorx://db.xmlmovies.com:2030/movies");
   
         /* Section B */
         String xpath = "//movie[@title='Music Man']";
         XPathQueryService service =
            (XPathQueryService) col.getService("XPathQueryService", "1.0");
         ResourceSet resultSet = service.query(xpath);
         
         /* Section C */
         ResourceIterator results = resultSet.getIterator();
         while (results.hasMoreResources()) {
            Resource res = results.nextResource();
            System.out.println((String) res.getContent());
         }
      }
      catch (XMLDBException e) {
         System.err.println("XML:DB Exception occurred " + e.errorCode);
      }
      finally {
         if (col != null) {
            col.close();
         }
      }
   }
}

驱动程序就是将 XAPI 接口连接到实际数据库或者二进制实现的模块。标记为“A”的代码段创建了数据库连接,并从数据库中选择一个集合。标注为“B”的代码段建立并执行了 XPath 查询(为了保持简单,没有使用名称空间)。而标注为“C”的片段则遍历并输出查询的结果。

结束语
目前的 XAPI 工作草案已有三年的使用历史,这也正是出现某些警告的原因,但不能因此完全放弃它。要知道,颇受追捧的 XQuery 在走向成功之前至少也经历了这么多年。另外,XML:DB 小组因为开发规范而出名(或者不那么出名),这一点对中期开发有很大影响,而且该规范非常简单而清晰,容易得到广泛的实现。(XUpdate 是一个很好的例子,该规范也需要修改,但仍然得到了广泛的实现。)现在就可以下载到很多实现(请参阅 参考资料),其中包括发布在 SourceForge 上的参考实现。我看到越来越多的轻量级 XML 存储库系统不断出现,如果您正在开发这样的系统,当然可以考虑提供类似 XAPI 的接口。它非常简单,容易理解,而且实现起来可能也不是很难。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms