欢迎光临
我们一直在努力

使XML本地化和关系化-数据库专栏,其他相关

建站超值云服务器,限时71元/月

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模式,然后注册它:
begindbms_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拷贝和粘贴操作。

  使用resource_view

  你应该知道的一个重要视图是名为resource_view的视图。resource_view视图为你所访问的知识库中的每个文档和文件夹返回一行。例如,通过执行下面的查询你可以得到/cd文件夹下所有xml文档的一个列表。

select any_pathfrom resource_viewwhere under_path(res,/cd)=1and extractvalue(res,/resource/contenttype)=text/xml;

any_path——————————-/cd/gospel/nothingless.xml/cd/legendsofthegreatlakes.xml

  上面显示的新的under_path函数使你能够测试一个给定的知识库资源是否在你指定的文件夹(或路径)中。在这个例子中,我使用该函数把查询结果限定在/cd文件夹及其子文件夹的资源中。通过使用对基本表所创建的一个层次式域索引可以使对resource_view视图进行的基于路径的查询更高效。这个索引是该知识库的一部分;你不用创建它。

图1:xml db知识库中示例cd模式的一部分

   资源视图中的res字段并不代表资源自身,而只是代表资源的元数据。对res字段运用新的extractvalue函数检查每个资源的内容类型。因此查询的结果被进一步地限制到指向xml文档的路径。/resource/contenttype语法代表xpath表示法。xpath是指定xml文档各部分的标准表示法;你将在许多对xml数据的查询中使用它。

  给定一个资料库路径,你可以使用新的xdburitype对象类型检索全部或部分基本xml文档。清单6显示两个查询。第一个查询是对以上代码的扩展,使用xdburitype来检索/cd文件夹下的所有xml文档。为了只提取cd标题,清单6中的第二个查询进行了进一步的改进,把标准的xpath语法附加到url的末端。

  对知识库数据的关系访问

  也可以通过直接访问基本表来访问知识库中的xml数据。我注册cd模式时创建的基本表是cd331_tab。你可以直接对这个表编写查询语句,但这些查询必须是支持xml的。要简化通过设计用于关系数据的报表工具访问xml数据,你可以创建一个如清单7中所示的视图。除了视图,清单7还对艺术家名字创建了一个索引。视图和索引使我能够有效地执行诸如下面的标准关系查询:

  select title  from cd_master  where artist=carl behrend;

  更新xml数据

  不幸的是,因为在cd_master视图中的所有字段都是基于sql函数的,所以该视图不能被更新。然而,可以更新知识库中的xml数据;我只需要如下所示更新注册模式时所创建的基本表:

update cd331_tab cdset value(cd) = updatexml(value(cd),/cd/website/text(),http://greatlakeslegends.com/legends.htm);

  注意这个新的updatexml函数中的xpath语法的使用。路径/cd/website/text()说明我要更新cd文档的website元素的文本。updatexml的第三个参数为那个文本指定新值。这是一个恰当的更新,并非常高效。xml db知识库并不需要重建被改变的整个xml文档。因为模式被注册了,所以xml db知识库能够以在底层对象结构只有website属性被触及的方式重写这个查询。

  结论

  通过使用xml db知识库,你可以把xml文档存储在数据库中,并使用标准的互联网协议访问那些文档。同时,你还可以使用标准的关系查询访问相同的xml文档或是那些文档的部分。你没有xml数据和关系数据,只有数据。"xml"和"关系"只是查看数据的不同范例。通过把数据从范例中分离出来,oracle9i保护你最重要的资产之一–数据–免受范例改变的影响。

  你应该知道的一个重要视图是名为resource_view的视图。resource_view视图为你所访问的知识库中的每个文档和文件夹返回一行。例如,通过执行下面的查询你可以得到/cd文件夹下所有xml文档的一个列表。

select any_pathfrom resource_viewwhere under_path(res,/cd)=1and extractvalue(res,/resource/contenttype)=text/xml;

any_path——————————-/cd/gospel/nothingless.xml/cd/legendsofthegreatlakes.xml

  上面显示的新的under_path函数使你能够测试一个给定的知识库资源是否在你指定的文件夹(或路径)中。在这个例子中,我使用该函数把查询结果限定在/cd文件夹及其子文件夹的资源中。通过使用对基本表所创建的一个层次式域索引可以使对resource_view视图进行的基于路径的查询更高效。这个索引是该知识库的一部分;你不用创建它。

图1:xml db知识库中示例cd模式的一部分

   资源视图中的res字段并不代表资源自身,而只是代表资源的元数据。对res字段运用新的extractvalue函数检查每个资源的内容类型。因此查询的结果被进一步地限制到指向xml文档的路径。/resource/contenttype语法代表xpath表示法。xpath是指定xml文档各部分的标准表示法;你将在许多对xml数据的查询中使用它。

  给定一个资料库路径,你可以使用新的xdburitype对象类型检索全部或部分基本xml文档。清单6显示两个查询。第一个查询是对以上代码的扩展,使用xdburitype来检索/cd文件夹下的所有xml文档。为了只提取cd标题,清单6中的第二个查询进行了进一步的改进,把标准的xpath语法附加到url的末端。

  对知识库数据的关系访问

  也可以通过直接访问基本表来访问知识库中的xml数据。我注册cd模式时创建的基本表是cd331_tab。你可以直接对这个表编写查询语句,但这些查询必须是支持xml的。要简化通过设计用于关系数据的报表工具访问xml数据,你可以创建一个如清单7中所示的视图。除了视图,清单7还对艺术家名字创建了一个索引。视图和索引使我能够有效地执行诸如下面的标准关系查询:

  select title  from cd_master  where artist=carl behrend;

  更新xml数据

  不幸的是,因为在cd_master视图中的所有字段都是基于sql函数的,所以该视图不能被更新。然而,可以更新知识库中的xml数据;我只需要如下所示更新注册模式时所创建的基本表:

update cd331_tab cdset value(cd) = updatexml(value(cd),/cd/website/text(),http://greatlakeslegends.com/legends.htm);

  注意这个新的updatexml函数中的xpath语法的使用。路径/cd/website/text()说明我要更新cd文档的website元素的文本。updatexml的第三个参数为那个文本指定新值。这是一个恰当的更新,并非常高效。xml db知识库并不需要重建被改变的整个xml文档。因为模式被注册了,所以xml db知识库能够以在底层对象结构只有website属性被触及的方式重写这个查询。

  结论

  通过使用xml db知识库,你可以把xml文档存储在数据库中,并使用标准的互联网协议访问那些文档。同时,你还可以使用标准的关系查询访问相同的xml文档或是那些文档的部分。你没有xml数据和关系数据,只有数据。"xml"和"关系"只是查看数据的不同范例。通过把数据从范例中分离出来,oracle9i保护你最重要的资产之一–数据–免受范例改变的影响。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 使XML本地化和关系化-数据库专栏,其他相关
分享到: 更多 (0)

相关推荐

  • 暂无文章