王朝网络
分享
 
 
 

Storing XML in Relational Databases(2)

王朝html/css/js·作者佚名  2006-12-17
宽屏版  字体: |||超大  

Storing XML in Relational Databases(2)

Storing XML in Relational Databases(2) Storing XML in Relational Databases(2)

From http://www.xml.com

IBM DB2 XML 扩展

SQL 到 XML 的映射

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

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 2000SQL到XML的映射

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文档。关键字ELEMENTS把SQL的中的列模拟为元素,否则,默认是把列模拟为属性。

用数据库存储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>

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

从数据库中抽取XML

JAVA类ResultSetXml有一个构造函数,它以一个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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有