使XML本地化和关系化
2009-01-02 14:30:00   来源:   评论:0 点击:

Oracle XML DB提供本地化格式和关系数据库访问。

  XML正快速地成为企业间数据交换的首选语言。然而,大多数企业把它们的数据存储在如Oracle9i数据库那样的关系数据库中。那么你怎样将分层次的、以文档为中心的XML和表格式的面向集合的关系数据库连接起来?你是把XML文档作为文件存储在文件系统中?还是把XML文档分开,把数据存储在关系数据库中?在两种方法间进行选择时需要根据你使用数据的方式进行权衡。但如果你不必进行选择呢?如果你可以同时使用两种方法,你会如何做呢?你可以使用Oracle9i数据库第2版中叫做XML DB知识库(XML DB Repository)的新特性。

  XML DB知识库说明

  Oracle XML DB既不是一个单独的产品也不是一个你必须安装的单独选项。Oracle XML DB指的是在直接内置于Oracle9i数据库的XML特性和技术的集合。其中一个关键特性就是XML DB知识库。这个知识库使你能够在Oracle9i数据库第2版中直接存储XML文档。一旦你的XML文档存储在该知识库中,你就能够以XML为中心的方式或以关系为中心的方式访问XML数据。

  要把XML数据存储在你的数据库中,你只需简单地使用FTP、HTTP或WebDAV等所有行业标准的协议写一个XML文档文件即可。而从数据库中获取XML数据就像执行一个SQL查询或使用上述协议之一读文件一样简单。

  场景设置

  假设你正在销售独立艺术家制作的CD。你需要和主要的音乐商店、在线站点和艺术家自身交换信息。你已经开发了用来描述CD内容的如清单1所示的XML文档格式,现在想利用XML DB 知识库把信息存储在数据库中。你想通过SQL轻松地访问数据并轻松地访问本地XML文档。简而言之,你希望数据既具有关系特性又具有层次特性。在这篇文章中,我是你的DBA,实现它是我的工作。

  注册XML模式

  我的第一步是使用XML DB知识库注册你的XML模式。当我注册一个XML模式时,该知识库创建能够保存那个模式实例的对象类型和对象表。下面对通过SQL*Plus执行的dbms_xmlschema.registerURI的调用从http://gennick.com/cd.xsd获取如清单2中所示的XML模式,然后注册它:

BEGIN
dbms_xmlschema.registerURI(
'cd.xsd',
'http://gennick.com/cd.xsd');
END;
/

  注意:我除了需要对各种模式对象类型的CREATE权限外,为了注册模式和创建这篇文章中的例子我还需要ALTER SESSION和QUERY REWRITE权限。

  清单3显示了由于注册CD模式而创建的一些结构和对象。一个名字是CD331_TAB的XML表被创建来保存模式的实例:在知识库中的每个CD文档将由这个表中的一行来表示。我可以通过查询USER_XML_TABLES数据字典视图得到XML表的一个列表。在这个例子中,我简单地在模式注册前后查询视图然后查找新的表名。CD331_TAB中的每一行将包含一个CD327_T类型的实例,这个类型对应于我们的XML模式来创建的。XML文档的第一层元素被表示为CD327_T类型的属性,属性名和XML字段名相匹配。例如,该对象类型中的Title字段直接对应于XML模式中的Title元素。Songs字段对应于Songs元素。Songs是XML模式中的一个复杂元素,同样地它被映射到另一个对象类型"Songs328_T"。如果我使用SQL*Plus命令DESCRIBE "Songs328_T",并继续研究Songs字段的定义,我会看到歌曲集合最终被作为一个VARRAY实现,在VARRAY中,每个元素都表示一首歌曲。

  当我注册一个模式时,我可以控制Oracle9i数据库生成的对象和类型名;我也可以控制被用来存储我的XML数据的特定数据类型。可以通过使用XML DB知识库定义的属性和oraxdb名字空间的部分注释XML模式来进行这些控制。当我不提供那些属性时,Oracle9i数据库为我生成它们,我可以通过查看存储在该知识库中的模式版本来简单地浏览Oracle9i数据库所生成的内容。图1说明了你如何能够方便地访问知识库数据,这次是通过HTTP,使用一个标准的Web浏览器来访问的。图1显示了我的知识库中的CD模式的一部分,你可以看到模式注释,它们全都以"oraxdb"开始。注意,URL使用8080端口,它是知识库使用的默认HTTP端口。

  默认情况下,注册模式时创建的全部对象将属于注册模式的用户所有。在这个例子中,我拥有清单3中的表和类型以及其他与该CD模式相关的所有对象。因为是我注册了那个模式,所以任何我保存到知识库中的XML文件(是该CD模式的实例)将被拆开然后存储在CD331_TAB表中。该模式和注册是特定于我的。其他用户保存的CD文件将不会被存储在我的表中。你可以对dbms_xmlschema.register模式使用一个可选参数,来创建一个影响所有用户的全局模式,以便所有用户都可以把CD文档保存到该表中。

  创建XML文件夹

  如果要把CD XML文档存储在XML DB知识库中,我就需要一个存放它们的文件夹。要创建一个文件夹,我作为SYSTEM用户登录到Oracle并执行清单4中的PL/SQL块。调用dbms_xdb.createfolder创建名为/CD的第一层文件夹。PL/SQL块然后使用dbms_xdb.setAcl过程创建把所有文件夹权限赋予拥有者(也就是SYSTEM用户)、把读权限赋予其他所有用户的访问控制列表(ACL)。下一步为了把文件夹的拥有者由SYSTEM改变为GENNICK,需要对资料库的RESOURCE_VIEW调用UPDATE语句。在文件夹创建后,提交是重要的;直到你提交后,该文件夹才对其他会话可见。现在我可以作为GENNICK使用FTP或WebDAV连接并把XML文件保存到/CD文件夹中。

  保存XML文档

  一旦我注册了模式然后创建一个文件夹来保存我的XML文档,把文档保存到知识库就像拷贝文件那样简单。清单5显示了一个拷贝(清单1中所示的)LegendsOfTheGreatLakes.xml文件到知识库的FTP会话。FTP open命令使用的端口2100是知识库为FTP会话使用的默认端口。注意,我可以不使用FTP,而是像以前那样在WebDAV和Windows Web文件夹简单地使用Windows拷贝和粘贴操作。


相关热词搜索:

上一篇:XML与面向Web的数据挖掘技术
下一篇:XML在B/S架构开发中的应用

分享到: 收藏
频道总排行
频道本月排行