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拷贝和粘贴操作。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器