Storing XML in Relational Databases(2)

 Storing XML in Relational Databases(2)

From http://www.xml.com

IBM DB2 XML 扩展

SQL XML 的映射

在用DB2作为XML存储库时,IBMXML扩展提供了两种访问和存储的方法:

1.        XML列:从一个列中存储和得到整个XML文档。

2.        XML集合:把XML文档分解成一系列的关系表,或者从一系列的关系表中重组成一个XML文档。

DTDs存储在DTD 库中,在DB2中是一个被称为DTD_REF 的表。它的模式名称叫“db2xml“。每个在DTD_REF中的DTD都有一个唯一的标识ID,数据表和XML文档结构之间的映射被一个数据访问定义(DAD)文件进行定义,DAT引用一个处理过的文档DTD,因此它在XML文档,此文档的DTD和映射至数据库表的规则之间提供了一个桥梁。

以下是一个DAD的例子:

<?xml version="1.0"?>

<!DOCTYPE    DAD    SYSTEM    "dad.dtd">   

<DAD>   

    <dtdid>FXTRADE.DTD</dtdid>   

    <validation>YES</validation>   

    <Xcollection>   

        <prolog>?xml version="1.0"?</prolog>   

        <doctype>!DOCTYPE     FXTRADE       FXTRADE.DTD </doctype>   

        <root_node>   

   <element_node     name="FXTRADE">   

       <RDB_node>   

           <table name="FXTRADE"/>   

           <table name="ACCOUNT" key="ID"/>    

           <condition>   

      FXTRADE.ACCOUNT=ACCOUNT.ID   

           </condition>   

       </RDB_node>   

       <element_node name="CURRENCY1">   

               <text_node>   

           <RDB_node>   

                 <table name="FXTRADE"/>   

                 <column name="CURRENCY1" type="CHAR(3)"/>   

           </RDB_node>   

                </text_node>

       </element_node>

       <element_node name="CURRENCY2">

               <text_node>

           <RDB_node>

                 <table name="FXTRADE"/>

                 <column name="CURRENCY2" type="CHAR(3)"/>

           </RDB_node>

              </text_node>

       </element_node>

       <element_node name="AMOUNT">

               <text_node>

           <RDB_node>

                 <table name="FXTRADE"/>

                 <column name="AMOUNT" type="DECIMAL(18,2)"/>

           </RDB_node>

               </text_node>

       </element_node>

       <element_node name="SETTLEMENT">

             <text_node>

           <RDB_node>

                 <table name="FXTRADE"/>

                 <column name="SETTLEMENT" type="DATE"/>

           </RDB_node>

              </text_node>

       </element_node>

       <element_node name="ACCOUNT">

           <element_node name="BANKCODE">

               <text_node>

                   <RDB_node>

                       <table name="ACCOUNT"/>

                       <column name="BANKCODE"

                           type="VARCHAR(100)"/>

                   </RDB_node>

               </text_node>

           </element_node>

           <element_node name="BANKACCT">

               <text_node>

                   <RDB_node>

                        <table name="ACCOUNT"/>

                        <column name="BANKACCT"

                            type="VARCHAR(100)"/>

                    </RDB_node>

               </text_node>

           </element_node>

       </element_node> <!--end of  Account element-->

   </element_node>    <!-- end of  FxTrade element -->

        </root_node>

    </Xcollection>

</DAD>

 

 

 

DAD通过element_node(元素结点) RDB_node(关系数据库结点)的关联定义了XML元素和关系数据库列之间的映象。顶层的元素结点FXTRADE 作为表FXTRADE        ACCOUNT之间的一个关联被定义。ACCOUNT拥有一个ID列作为主键。子元素 CURRENCY1映射为表FXTADEK 表中的字段CURRENCY1,其它的类似。 

 

 

 

Microsoft SQL Server 2000

SQLXML的映射

SQL Server的双向映射规则均应用了不同的语法,下面将会讲述相关的细节。

从数据库中提取XML文档

数据库列和XML元素或属性之间的映射是用SELECT语句中的AS别名来定义的:

<database column> AS [Element Name! Nesting Level! Attribute Name! Directive]

文档的最顶层被指定为一级,如下面所示。默认的,列均被映射成为属性,指示“element”可以改变默认的设置。

从数据库数据产生XML文档的处理过程分两步:

1.         为输出XML文档的元子元素创建AS-aliases。别名定义了元素间的父子关系,下面是为我们的样例文档定义的别名:

FXTRADE       /* LEVEL=1 */   

    CURRENCY1   [FXTRADE!1!CURRENCY1]   

    CURRENCY2   [FXTRADE!1!CURRENCY2]   

    AMOUNT      [FXTRADE!1!AMOUNT]   

    SETTLEMENT  [FXTRADE!1!SETTLEMENT]   

    ACCOUNT   /* LEVEL=2  */   

        BANKCODE     [ACCOUNT!2!BANKCODE]   

        BANKACCT     [ACCOUNT!2!BANKACCT]  

2.         SQL中定义输出树的结构,树的每一层均用一个SQL语句来定义,然后通过UNION联合所有的SQL语句来整合树中所有的层。Level-1 SELECT语句先定义了其它层上所有原子元素的名字,每个SELECT语句都有一层标记和它的父标记,对应于对树的根,在结果集中有一条记录,如下第一条SELECT语句:

SELECT   

    1          AS    Tag,   

    NULL       AS    Parent,   

    NULL       AS    [FXTRADE!1!CURRENCY1],   

    NULL       AS    [FXTRADE!1!CURRENCY2],   

    NULL       AS    [FXTRADE!1!AMOUNT],   

    NULL       AS    [FXTRADE!1!SETTLEMENT],   

    NULL       AS    [ACCOUNT!2!BANKCODE],   

    NULL       AS    [ACCOUNT!2!BANKACCT]   

FROM           

    FXTRADE   

UNION ALL   

SELECT   

    2,   

    1,   

    FXTRADE.CURRENCY1,   

    FXTRADE.CURRENCY2,   

    FXTRADE.AMOUNT,   

    FXTRADE.SETTLEMENT,   

    ACCOUNT.BANKCODE,   

    ACCOUNT.BANKACCT   

FROM   

    FXTRADE,    ACCOUNT   

WHERE   

    FXTRADE.ACCOUNT = ACCOUNT.ID   

ORDER    BY    [ACCOUNT!2!BANKCODE],   

        [ACCOUNT!2!BANKACCT]   

FOR    XML    EXPLICIT, ELEMENTS 

FOR XML通过分析标记和在行集的AS别名来构造XML文档,关键字EXPLICIT选择更有弹性的用户自定义模式来构造XML文档,而AUTO模式则根据默认的规则来构造XML文档。关键字ELEMENTSSQL的中的列模拟为元素,否则,默认是把列模拟为属性。

 

用数据库存储XML

OPENXML来存储XML文档,一个行集的新功能,类似于表或视图,OPENXML可用于插入或更新,或作为SELECT INTO 的目标表,其简单语法如下:

OPENXML    (<XML document handler>, <path pattern>, <flags>)   

WITH     (Schema | Table)

存储XML文档的过程分以下三步:

1.  通用解析XML文档为DOM获得其句柄,这可以使用存储过程sp_xml_preparedocument

2.  通过关联模式中的字段和原子元素来创建模式。

XML元素的定义是通过一个路径模式(绝对基路径)加上一个相对元素路径。以元素为中心的映射用标专值2来指明。现存的表可用于替代模式,字段名和XML名字对应。]

3.  用存储过程sq_xml_removedocument把解析过的XML文档从内存中移除。

下面是一个例子:

DECLARE @idoc int   

DECLARE @doc varchar(1000)   

SET @doc ='   

<FXTRADE>   

    <CURRENCY1>GBP</CURRENCY1>   

    <CURRENCY2>JPY</CURRENCY2>   

    <AMOUNT>10000</AMOUNT>   

    <SETTLEMENT>20010325</SETTLEMENT>   

    <ACCOUNT>    

        <BANKCODE>812</BANKCODE>   

        <BANKACCT>00365888</BANKACCT>   

    </ACCOUNT>   

</FXTRADE>'   

-- Create internal DOM representation of the XML document.   

EXEC sp_xml_preparedocument @idoc OUTPUT, @doc   

-- Execute a SELECT statement using OPENXML row set provider.   

SELECT *   

FROM OPENXML (@idoc, '/FXTRADE/ACCOUNT', 2)   

WITH (   

  CURRENCY1     CHAR (3),       '../@CURRENCY1',   

  CURRENCY2     CHAR (3),       '../@CURRENCY2',   

  AMOUNT        NUMERIC (18,2), '../@AMOUNT',   

  SETTLEMENT    DATETIME,       '../@SETTLEMENT',   

  BANKCODE      VARCHAR (100),  '@BANKCODE',   

  BANKACCT      VARCHAR (100),  '@BANKACCT' )

EXEC sp_xml_removedocument @idoc   

 

总结

Microsoft SQL Server 2000,提取和存储XML文档并不是用对称的语法,提取用的是扩展SELECT子句FOR XML。存储XML则是引进了行集功能OPENXML,类似于表或视图,提取映射规则是基于:A)为特定的树层次引进标记,B)为表中的字段和XML文档元素的父子关系建立关联。存储XML是把XML文档重建为简单的模式或表,“字段-元素”关联是用XPATH表达式来定义的。

 

SYSBASE ADAPTIVE SERVER

SQL to XML映射

SYBASE 利用一个XML文档类型ResultSet来描述XML文档的元数据(如元素名,类型,大小等)和实际的行数据,下面是假想FxTradeSet.xml文档的摘录:

<?xml version="1.0"?>   

<!DOCTYPE ResultSet SYSTEM "ResultSet.dtd">   

<ResultSet>   

    <ResultSetMetaData>   

        <ColumnMetaData   

        ...

        getColumnLabel="CURRENCY1"   

        getColumnName="CURRENCY1"   

        getColumnType="12"   

         ... />   

   ...   

   </ResultSetMetaData>   

   <ResultSetData>   

        <Row>   

           <Column name="CURRENCY1">GBP</Column>   

        ...   

        </Row>   

    </ResultSetData>   

</ResultSet>   

ResultSetDTD不允许对嵌套元素的定义。

 

从数据库中抽取XML

JAVAResultSetXml有一个构造函数,它以一个SQL查询作为参数,然后getXmlLText方法从结果集中抽取XML文档:

jcs.xml.resultset.ResultSetXml     rsx = new jcs.xml.resultset.ResultSetXml   

           ("Select * from FxTrade", <other parameters>);   

FileUtil.string2File ("FxTradeSet.xml", rsx.getXmlText());   

 

用数据库存储XML

JAVAResultSetXml也可以用XML文档作为其构造函数据的参数,然后toSqlScript方法会产生一个序列的SQL语句来对特定的表进行插入或更新操作。

String    xmlString = FileUtil.file2string ("FxTradeSet.xml");   

jcs.xml.resultset.ResultSetXml     rsx = new jcs.xml.resultset.ResultSetXml   

           (xmlString);   

String     sqlString  = rsx.toSqlScript ("FxTrade", <other parameters>)   

 

总结

在这里,抽取和存储XML文档本质上是对称的,存储不允许修改一个以上的表,抽取则把一个SQL查询的结果转换成一个简单结构的文档。

 

各供应商的对比:

供应商

映射规则

单表/多表

转换方法

对称抽取/存储

Oracle

在构造关系对象数据

模型中指明

多表

有相应的JAVA

如果XML文档和关系

对象模型匹配的话是对称的

IBM

DAD(数据访问定义文件

多表

内置的存储过程

对称

Microsoft

SQL扩展,行集功能

抽取是多表,存储是单表

SQL语句

FOR XML和行集OPENXML

不对称

Sysbase

结果集的DTD

单表,但查询可以包含多表

相应的JAVA

对称

 

 

 

 

 

 

供应商共同的特点:

1.  XML的持续化都有一个特定的原则,也就是说,对任意的XML文档存储并没有普便的方法。

2.  存储时均需要对XML文档进行预处理,比如把数字/日期变换成本地格式等,XSLT可以用于这种处理过程。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值