网站制作

本类阅读TOP10

·IIS 安装配置全攻略
·用VS.NET打开网上下载的.NET web项目出错的解决办法
·HTML 4.0 语言快速参考
·限制TextArea区的文字输入数量
·如何在网页上实现进度条
·Apache的配置步骤及测试
·谈谈Jesse James Garrett提到的Ajax
·html基础学习笔记(2)
·页面垂直居中的两种方法
·用asp遍历目录下文件的例子

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
Storing XML in Relational Databases(2)

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

 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可以用于这种处理过程。

 




相关文章

相关软件