从 DAD 到带注释的 XML 模式分解

Mayank Pradhan, 专职软件工程师, IBM

2006 年 5 月 18 日

带注释的 XML 模式分解简介

DB2 Viper 中引入的带注释的 XML 模式分解特性可用于将 XML 文档整个或部分地分解成关系表。它使用 XML 模式中的注释作为映射语言,将 XML 文档中的信息映射为关系表。新的 XML 分解特性使用 XML 模式(Schema)作为获得映射信息的平台。因为 XML 模式是一种开放的标准,所以它只需要在映射语言规范中增加很少的专有特性。相对于完全专有语言中的等价映射规范来说,这允许更短的学习曲线。注意,添加到 XML 模式的注释并不参与相应 XML 文档的验证。这允许用户使用相同的 XML 模式来进行 XML 文档的映射和验证。

新的 XML 分解特性要求带注释的 XML 模式能够注册到 XML 模式存储库(XSR)中。XML 模式存储库也是 DB2 Viper 中引入的一种新特性。顾名思义,它是一个 XML 模式仓库,其中可能包含一个或多个 XML 模式文档。注册在 XSR 中的 XML 模式范围局限于数据库。任何注册在 XSR 中的 XML 模式都可用于以下两个目的:

  1. 在 XML 文档被插入 XML type 列中时,对它们进行验证。
  2. 在 XML 文档被分解成关系表时,对它们进行验证。

 

任何注册在 XSR 中的 XML 模式在具有至少一个与分解相关的注释时,都可以用于 XML 分解。当一个 XML 模式可用于分解时,会进行一些检查以确保注释的正确性,注释中指定了 XML Schema 类型与 DB2 列类型的兼容性,以及是否存在关系表和列。如果带注释的 XML 模式被认为有效,映射信息就被抽取并以马上可用的二进制格式存储在编目表中。

最后,任何符合带注释的 XML 模式的 XML 文档现在都可按照指定的映射分解成关系表。

带注释的 XML 模式映射语言设计的目标是为这样的用户服务,他们已经有一个带有几个应用程序的现有关系模式,现在又想要将 XML 文档中的数据转换到现有的关系模式中。像 XML 模式所表达的一样,XML 文档的结构完全不同于关系模式,因为用户对 XML Schema 的设计具有很少的控制,甚至没有控制。因此,映射语言被设计来对整个分解过程提供更大的灵活性和粒度级控制。有 11 种不同的映射构造(其中有些甚至具有多个枚举值),用于表达从 XML Schema 中声明的元素和属性到关系模式中的表-列对的映射。每种构造设计用于主要满足一种良好定义的目的。大多数这样的构造源自 XML Extender 客户的特性请求。表 1 列出了这些构造及其主要目标:


表 1. 映射构造及其主要目标

SNo.

注释构造

目的

类似的 DAD 构造

简要描述

将 XML 元素/属性映射到表-列对


db2-xdb:rowSet

可用于指定一个逻辑上关联的行集的逻辑或物理容器(物理容器可以是一个关系表)。

table

这用于指定元素/属性将被映射到的表。


db2-xdb:column

必须用于指定与元素/属性相关联的信息应该被分解到的列。

column

这与 DAD 中的上面这个 table 构造一起用于指定元素/属性将被映射到的表-列对。


db2-xdb:defaultSQLSchema

应该用于指定涉及的关系表的 SQL 模式。

n/a

表需要针对每种用法被显式地限定,或者由调用分解存储过程的用户自动地限定。


db2-xdb:rowSetMapping

将指定到行集-列对的单个映射的所有相关注释构造成组。映射到不同行集-列对的同一元素/属性声明上允许一个或多个 db2-xdb:rowSetMapping 构造。

RDB_Node

允许表-列对映射被成组。任何元素/属性节点上只允许一个这样的映射。


db2-xdb:table

该注释允许用户将要分解的 XML 文档的各个部分的多个项映射到相同表-列对的不同行。

n/a

这样的操作不能使用任何 DAD 构造来执行。

条件分解


db2-xdb:locationPath

允许用户基于元素/属性出现的上下文指定不同的目标(表)。这允许用户注释以可重用类型声明的元素和属性,且组被基于上下文而分解。

n/a

locationPath 隐含在 DAD 本身中,因为整个 XML 层次结构需要使用 element_node/attribute_node 构造进行重复。


db2-xdb:condition

允许用户基于 XML 文档中元素/属性的内容过滤将要插入的数据。

condition

该构造在 DAD 中被重载。取决于它是在哪里指定的,它具有以下两个目的。

  1. 当是在根元素上指定的时,它用于指定联结条件。换句话说,该构造主要允许同一个元素/属性被映射到多个表-列对。这必须使用 db2-xdb:rowSetMapping 构造在带注释的 XML 模式中显式地指定。
  2. 当是在非根元素上指定的时,它用于过滤数据。该功能类似于带注释的 XML 模式的 db2-xdb:condition 构造。

控制数据的分解


db2-xdb:contentHandling

允许用户从以下选项选择元素的内容:

  • stringValue: 所有后代文本节点的拼接(concatenation)
  • textValue: 所有子文本节点的拼接
  • serializeSubtree: 该元素的开始标记和结束标记之间的所有内容的标记形式的连续字符串,包括元素本身的开始标记和结束标记,还有注释和处理指令。

n/a

这不可以用 XML Extender 的分解框架来完成。

要分解的数据的转换


db2-xdb:normalization

允许用户在内容插入之前,指定将要映射到字符目标列的 XML 元素或属性的内容上的规范化行为。提供以下选择:

  • canonical: XML 值在被插入目标列之前,根据它的 XML 模式类型被转换成它的规范格式。
  • original: 最初的字符数据。
  • whitespaceStrip: 在被插入目标列之前,所有前导和结尾的空格被删除,连续的空格被缩减为一个空格字符。

n/a

XML Extender 分解不在插入指定的表-列之前执行任何种类的规范化。


db2-xdb:expression

允许用户指定一个定制的表达式,该表达式的结果被插入该元素将被映射到的表中。

n/a

用户指定的数据转换不能在 XML Extender 框架执行分解期间进行。如果需要这样一个操作,用户要么必须在分解它之前使用 XSL 转换他们的 XML 文档,要么必须编写触发器来在插入之前对数据进行修改。


db2-xdb:truncate

允许用户指定在 XML 值被插入字符目标列时是否允许截断。

n/a

该操作在 XML Extender 中也不被允许。

注意: db2-xdb 是用于我们的所有注释的前缀。用户可以使用他们选择的任何前缀,但是前缀必须绑定到名称空间 URI http://www.ibm.com/xmlns/prod/db2/xdb1,否则,注释将会被分解注册和运行时引擎所忽略。

XML Extender 分解框架不支持元素/属性在任何名称空间中。


为方便起见,所有列出的注释都可指定为元素/属性声明的非本机属性,或者使用 db2-xdb:rowSetMapping 构造指定为 xdb:annotation/xdb:appinfo 层次结构的子节点。有关这些注释的更多详细信息,请参阅 DB2 文档

带注释的 XML 模式分解中除了引入各种映射构造之外,还引入了一种新的算法,可用于确定一对一或一对多关系,无需引入任何显式的(用户指定的)映射构造。该算法可通过查看映射到同一行集的项中涉及的 maxOccurs 属性和模型组来确定关系。与其他分解解决方案不一样,由于使用这一算法,所以该分解方案中不存在只允许兄弟或子元素/属性被映射到同一表的约束。只要映射到同一行集的所有元素/属性形成一个合法的一对一或一对多关系,映射到同一表的元素/属性就可以来自 XML 模式的任何部分。这个新算法通过检测一对多关系,允许多值依赖关系被分解成关系表。该算法不仅基于涉及到的元素/属性来创建行,也基于模型组的类型来创建行。

新的 XML 分解也具有一个强类型的验证器和类型转换引擎。在注册期间,如果声明的模式类型被认为与相应的目标列类型不兼容,那么它将不允许元素/属性被分解成目标列。但是如果可能的话,它允许类型转换。例如,一个类型为整数的元素/属性可以被映射到一个类型为字符的列。

前面的性能比较表明,由于采用了新的架构和算法,新的带注释的 XML 模式分解比 XML Extender 分解要快得多。

迁移的考虑因素

以下是从 XML Extender 分解迁移到带注释的 XML 模式分解时要考虑的主要因素:

  1. 映射文档的迁移: 用户需要将他们的 DAD 迁移到带注释的 XML 模式,以便使用新的功能。这可能是迁移时要做的最大工作量。但是这可以用下面介绍的一个工具来帮助完成。该工具将帮助用户基于 DAD 将他们的 XML 模式转换成带注释的 XML 模式文档。

  2. 增加了新的注册步骤: 用户现在需要将带注释的 XML 模式注册到 XML 模式存储库。这类似于 XML Extender 中的 enable_collection 步骤。但是因为这是 XML Extender 中的一个可选步骤,所以有些用户可能根本就不具有集合。但是当使用带注释的 XML 模式分解时,则必须将 XML 模式注册到 XML 模式存储库中,并在针对它分解任何 XML 文档之前为分解而启用它。

  3. 存储过程调用的迁移:新的存储过程调用看起来像下面这样:

    
    xdbDecompXML ( rschema , xmlschemaname , xmldoc , documentid , validation , 
     reserved , reserved , reserved )

    rschema:关系模式,XSRObject 是在该模式中创建的。XSRObject 被创建为注册和完成 XML 模式的一个序列,XML 模式在本例中被注释为要如何进行分解。

    xmlschemaname: XSRObject 的名称,XSRObject 中包含这样的 XML 模式,即用于通过注释描述 XML 文档应该如何被分解。

    xmldoc:该参数的类型为 BLOB,用于传递将被分解的 XML 文档。

    documentid: AXML 文档的标识符,用于在 db2diag.log 中报告诊断信息,也被返回为错误消息的一部分。

    validation: 如果 XML 文档在被分解时应该进行验证,则该参数应设置为 1。否则,应该设置为 0。

    reserved: 所有保留的参数应该作为 null 传递。

基于将要分解的 XML 文档的大小,该存储过程有五个变种。所有变种具有相同的参数,只是用于传递 XML 文档的 BLOB 的大小不同。表 2 描述了该存储过程的不同变种:


表 2. 存储过程的不同变种

存储过程名

相应的 XML Extender 存储过程

可以分解的最大文档大小

SYSPROC.XDBDECOMPXML

DB2XML.DXXSHREDXML

1MB

SYSPROC.XDBDECOMPXML10MB

n/a

10MB

SYSPROC.XDBDECOMPXML25MB

n/a

25MB

SYSPROC.XDBDECOMPXML50MB

n/a

50MB

SYSPROC.XDBDECOMPXML75MB

n/a

75MB

SYSPROC.XDBDECOMPXML100MB

DB2XML.DXXSHREDXML100MB

100MB



注意,带注释的 XML 模式存储过程属于 SYSPROC 模式,并且是内置的。它的使用不需要启用数据库,与 XML Extender 中一样。

  1. 错误处理:新的存储过程现在返回带有适当 SQLCODE 和 SQLSTATE 的 SQLCA,在使用 SQL 时与错误处理框架更加内联。这允许应用程序使用现有的基础设施(如果可用的话)来处理 SQL 错误。SQLCA 可用于格式化和构建本地化消息。

注意,与 DB2 Viper 版本中引入的所有新的 XML 相关特性一样,新的带注释的 XML 模式分解也只在 Unicode 数据库和单个分区的数据库上受到支持。

XML 模式转换工具

DAD 到带注释的 XML 模式转换实用程序帮助用户基于 DAD 中描述的映射规则将其 XML 模式转换成带注释的 XML 模式。XML 模式和 DAD 必须描述相同的 XML 文档集,尽管 XML 模式描述 DAD 所描述的文档的超集也是可能的、可接受的。不具有 XML 模式的用户可以使用 Internet 上免费得到的工具容易地从相应 DTD 甚至 XML 文档生成 XML 模式。DAD 到带注释的 XML 模式的转换工具然后可以把 XML 模式和 DAD 当成输入,生成一个带注释的 XML 模式。该工具支持对 XML 模式的构造进行导入、包含和重新定义。(换句话说,如果一个 XML 模式通过导入、包含或重新定义分布于很多 XML 模式文档中,那么只需要主模式文档的路径 —— 通过该文档,所有 XML 模式文档可通过导入、包含或重新定义而到达。)该工具将跨这些模式文档注释元素/属性声明。注意,因为 DAD 不支持名称空间,所以该场景中不可能使用 import 构造。


Usage:

DAD2AS dad_filename.dad primary_schema_doc.xsd defaultSQLSchemaName

该实用程序有三个输入 —— 一个 DAD 文件、主 XML 模式文档和默认的 SQL 模式(表就在该模式中)。基于 DAD 中指定的映射信息,它将指定的 XML 模式转换成一个带注释的 XML 模式,以用于 DB2 Viper 的带注释的 XML 模式分解特性。

参数

指定的 (RDB_NODE) DAD,通常用于 XML Extender 分解,必须是一个有效的 DAD。它为该工具提供映射信息。该实用程序将读取 DAD 文件,推断映射,并将同一映射应用于作为第二个参数提供的 XML 模式中的适当元素/属性。

XML 模式必须与 DAD 匹配;其中不应该具有用于 DAD 中的任何上下文中却没有在 XML 模式的相同上下文中定义的元素/属性。换句话说,DAD 和 XML 模式必须处理相同的 XML 文档集合。(如果用户不具有 XML 模式却具有 DTD,那么他们可以使用各种工具来将 DTD 转换成 XML 模式。)该工具假设,XML 模式中定义的元素/属性都不会在任何名称空间中,因为元素/属性的名称空间限定在 DAD 中也不受支持。

建议用户在运行该工具之前对他们的模式文档进行一下备份,因为该工具将修改主文档和使用 xsd:include、xsd:import 或 xsd:redefine 引用的模式的一部分的任何文档

第三个参数用于限定任何未限定的表引用。如果表的一个引用不是限定在 DAD 中,就会被假定在指定的默认 SQL 模式中。但是即使 DAD 中的所有表都是限定的,该参数也是必需的。

注意:在相同的模式文档上多次运行该工具将导致在 XSR 中启用分解时出现错误,因为在每次运行时,该工具都会将相同的映射集添加到相同的元素/属性集。

工具前提条件

  1. JRE 1.4.2 或 JRE 1.5
  2. JARs for Eclipse Modeling Framework
  3. JARs for XSD 插件
  4. JARS for xml4j-4_2_2 或等价的 Xerces-J

下面列出了下载这些工具的链接。

如何运行它

该工具是用 Java™ 编写的,因此可运行于 JRE 支持的所有平台上。但是同时为运行于 Windows® 上提供了 .bat 文件。这些 .bat 文件设置 PATH 和 CLASSPATH 变量。用户应该在与他们的安装对应的 CLASSPATH 和 JDK 中设置 JAR 的路径。有两种风格的 .bat 文件,即 Dad2AS_Eclipse.bat 和 Dad2AS_DB2DWB.bat。文件 Dad2AS_Eclipse.bat 是为从 www.eclipse.org 直接下载 Eclipse 和相关插件的用户定制的,而 Dad2AS_DB2DWB.bat 是为已经下载了 DB2 Developer Workbench 的用户定制的。注意,如果下载了 DB2 Developer Workbench,那么所有必需的插件都自动随它一起下载了。

示例

文章末尾中也提供了一个示例。一旦解压了下载文件,就可在 sample 子目录中发现该示例。该示例具有一个 DAD 文件、初始的 XML 模式以及使用该工具产生的转换后的带注释的 XML 模式。

DAD 文件是 Order.dad。

初始的 XSD 文件是 Order.xsd。

使用该工具创建的带注释的 XML 模式是 Order_AS.xsd。

注意, 在 Order_AS.xsd 中插入注释后,为了方便起见,已经运行了一个打印格式良好的 XML 工具。

该工具的限制

  1. 由于一个使用 DAD 中的 <condition> 构造在 DAD 中的非根元素中指定的条件,所以不会添加对应于元素/属性声明的 db2-xdb:condition 注释。这可以手动地添加,或者修改源代码也可以做到这一点。

结束语

带注释的 XML 模式分解是 DB2 Viper 中引入的一个新特性,是用新的算法和映射语言重新编写的特性。映射语言与算法一起提供了一种高度灵活、有效且系统的分解 XML 文档的方法。它可以分解在形式上完全不同于目标关系模式的 XML 模式。前面的性能比较也表明了,新的带注释的 XML 模式分解特性在运行时间方面比 XML Extender 分解要快得多。由于所有这些性能好处,即这个新特性提供的灵活性和结果的可预测性,迁移到 DB2 Viper 中的带注释的 XML 模式分解是有益的。 DAD 到带注释的 XML 模式生成工具通过将 DAD 转换成一个等价的带注释的 XML 模式,使得迁移任务容易得多,来帮助用户进行迁移。

下载

描述名字大小下载方法
DAD to annotated XML schema converter toolDAD2AS.zip30KBHTTP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值