级别: 中级 Mayank Pradhan (mayankpr@us.ibm.com), 高级软件工程师, IBM
2006 年 5 月 25 日 IBM® DB2® Viper 版本带来很多 XML 相关(和非 XML)的特性。这些特性之一是注释 XML 模式分解,它能够把 XML 文档分解为关系表。注释 XML 模式支持各种映射结构,能够把在 XML 模式中定义的元素/属性映射为相关模式中的表-列对。对于由很多 XML 模式文档组成的大型 XML 模式,手工注释是一项困难的任务。本文对工具 DefaultAnnotater 进行了介绍,使用该工具能创建默认映射和 XML 文档能够分解为的相应默认关系模式。本文不仅为试验新的功能而且为进一步增强给定 XML 模式中的映射提供了一个好的入门平台。
注释 XML 模式分解介绍
在 DB2 Viper 中引入的注释 XML 模式分解功能,可以用来把 XML 文档全部或者部分地分解为关系表。它在 XML 模式中使用注释作为映射语言把 XML 文档中的信息映射为关系表。由于 XML 模式是一个开放的标准,并只需要对映射语言规范中的专有特性进行很少的扩充,所以新的 XML 分解功能使用 XML 模式作为平台来获取映射信息。与等效的使用完全专有语言的映射规范相比,它具有更短的学习曲线。注意,添加到 XML 模式中的注释不参与相应 XML 文档的有效性确认。这允许使用同一个 XML 模式来对 XML 文档进行映射和有效性验证。
新的 XML 分解功能要求在 XML 模式存储库中注册注释 XML 模式。XML 模式存储库也是 DB2 Viper 中引入的新功能。正如它的名字所表明的,它是可以由一个或几个 XML 模式文档组成的 XML 模式存储库。在 XML 模式存储库中注册的 XML 模式的范围限于数据库。在 XML 模式存储库中注册的任何 XML 模式可以用于以下两个目的:
- 当把 XML 文档插入到 XML 类型的列中时,验证 XML 文档的有效性
- 当把 XML 文档分解为关系表时,验证 XML 文档的有效性
如果 XML 模式至少存在一个与分解相关的注释,则可以允许 XML 分解使用在 XML 模式存储库中注册的任何 XML 模式。当 XML 模式允许进行分解时,要进行检查以确保注释的正确性、XML 模式类型与 DB2 列类型的兼容性和存在注释中指定的关系表和列。如果确认注释 XML 模式有效,则提取映射信息并把它以可用的二进制格式存储在编目表中。
最后,可以把任何符合注释 XML 模式的 XML 文档按照指定的映射分解为关系表。
注释 XML 模式映射语言供那些已经拥有关系模式而且一些应用程序已经运行关系模式的用户使用,这些用户现在希望使用 XML 文档中的数据,这些文档的结构使用 XML 模式表示为已存在的关系模式。XML 模式的结构可能与关系模式完全不同,因为用户很少或完全不控制 XML 模式的设计。因此,把映射语言设计为能提供整个分解过程的更高灵活性和更细粒度的控制。存在 11 种不同的映射结构,其中一些具有多个枚举值,用来表示从 XML 模式中声明的元素和属性到关系表中表-列对的映射。每种结构都设计为主要满足一个定义良好的目的。这些结构的大多数是应用户的功能请求而设计的。表 1 列出了这些结构和它们的主要目标:
表 1. 映射结构和它们的主要目标
|
SNo.
|
注释结构
|
目的
| |
把 XML 元素/属性映射为表-列对
|
|
db2-xdb:rowSet
|
可以用来指定逻辑上相关联的行集的逻辑或物理容器(物理容器可以是关系表)。
|
|
db2-xdb:column
|
必须用来指定列,与元素/属性相关联的信息应该分解到此列中。
|
|
db2-xdb:defaultSQLSchema
|
应该用于指定有关的关系表的 SQL 模式。
|
|
db2-xdb:rowSetMapping
|
把所有相关联的指定到 rowSet-column 对的单个映射的注释结构分组。在映射到不同的 rowset-column 对的同一个元素/属性声明上允许一个或多个 db2-xdb:rowSetMapping 结构。
|
|
db2-xdb:table
|
允许用户把要分解的 XML 文档的不同部分的多个项作为不同的行映射到同一个表-列对。
| |
条件分解
|
|
db2-xdb:locationPath
|
允许用户根据在其中出现元素/属性的上下文指定不同的目标(表)。这允许用户根据上下文注释以可重用类型声明的元素和属性以及注释要分解的组。
|
|
db2-xdb:condition
|
允许用户根据 XML 文档中的元素/属性内容过滤要插入的数据。
| |
控制要分解的数据
|
|
db2-xdb:contentHandling
|
允许用户从以下的选项中选择元素的内容:
-
stringValue: 所有后代文本节点串联而得到的值
-
textValue: 所有子节点串联而得到的值
-
serializeSubtree: 此元素开始和结束标记之间所有内容的连续字符串(标记形式),包括元素自身的开始和结束标记,也包括注释和处理指令
| |
转换要分解的数据
|
|
db2-xdb:normalization
|
允许用户在插入内容之前为要映射为字符目标列的 XML 元素或属性的内容指定标准化行为。提供以下的选项:
-
canonical: 在插入到目标列之前,根据 XML 值的 XML 模式类型,把 XML 值转换为它的规范形式
-
original: 最初的字符数据
-
whitespaceStrip: 在插入到目标列之前,删除所有前导和尾部空白,把所有连续空白合为单个空白字符
|
|
db2-xdb:expression
|
允许用户指定自定义表达式,把该表达式的结果插入此元素所映射的表中。
|
|
db2-xdb:truncate
|
允许用户指定在将 XML 值插入到字符目标列中时是否允许截断。
| |
db2-xdb 是用于所有注释的前缀。用户可以使用他们选择的任何前缀。但是,该前缀必须绑定到命名空间
URI http://www.ibm.com/xmlns/prod/db2/xdb1。否则,注释将被分解注册和运行时引擎忽略。
|
为方便起见,可以把所有列出的注释指定为元素/属性声明的非固有属性,或指定为使用 db2-xdb:rowSetMapping 结构的 xsd:annotation/xsd:appinfo 层次结构的孩子。有关每种注释的更多细节请参考 DB2 文档。
除了引入到注释 XML 模式分解中的各种映射结构以外,它也包括一个新算法,该算法能确定一对一或一对多关联,而不用引入任何显式的(用户指定的)映射结构。通过查看 maxOccurs 属性和涉及映射到同一 rowSet 的项的模型组,该算法能够确定关联。由于有了此算法,与其他的分解解决方案不同,没有只允许将兄弟或孩子元素/属性映射到同一个表的约束。只要所涉及的映射到同一个 rowSet 的所有元素/属性构成合法的一对一或一对多关联,映射到同一个表的元素/属性就可以来自于 XML 模式的任何部分。通过检测一对多关联,新的算法允许将多值的依赖项分解到关系表中。该算法不但根据有关的元素/属性的基数创建行,而且根据模型组的类型创建行。
新的 XML 分解还具有一个强大的类型验证器和类型转换引擎。在注册期间,如果认为声明的模式类型与相应的目标列类型不兼容,它将禁止把元素/属性分解到目标列中。但是,如果可能,它允许类型转换。例如,可以将整数类型的元素/属性映射为字符类型的列。
由于新的架构和算法,早期的性能对比显示新的注释模式 XML 分解比 XML Extender 分解要快很多。
默认映射生成器工具
与根据 XML 模式创建一个默认关系模式,然后把 XML 文档分解到其中相比,将已有的 XML 模式映射为已有关系模式要更加困难。将 XML 文档分解到专门创建的关系模式中只是新功能所宣称要解决的更困难和更一般问题的一种特例。但是,对于这样的新技术,具有默认映射是有用的。这不但有助于用户熟悉新的映射结构,而且提供根据他们的需要定制应用程序的平台。此工具可以创建关系模式并在相应的输入 XML 模式中插入注释。在生产环境中,默认的映射几乎总是不够的;通常需要某种程度的映射调整。将默认映射逻辑放在注释 XML 模式分解之外的目的是,允许用户依赖默认映射并根据他们的需求调整它。用户可以在 XML 模式中插入的默认映射结构的顶部添加上面表中所介绍的任何注释结构。本节所描述的工具允许用户为任何给定的 XML 模式生成默认映射和关系模式。
默认的映射生成器实用工具允许用户分解 XML 文档,而不必在 XML 模式中写入任何注释。此工具需要两种输入:
- 原始的 XML 模式文档:XML 模式文档,经由该文档并通过浏览 import/include/redefine 结构可以得到所有 XML 模式文档
- 涉及的所有表的默认关系模式
然后它生成下面的输出:
- 将用于创建关系模式的 DDL 输出到标准输出设备
- 在 XML 模式中插入需要的注释,以便将所有元素/属性映射进作为输出返回的关系模式中
此工具从全局元素声明开始并深入到层次结构中,注册层次结构路径中的每个元素/属性;对每个全局元素声明执行同样的操作。当它穿过 XML 模式时,也创建用于关系模式的 DDL。它在穿过模式期间遇到的每个 complexType 类型元素的名称被当作新的表名。simpleType 类型的子属性和元素的名称是该表的列的名称。这个工具还在 XML 模式的元素/属性声明中插入注释来把它映射到相应的表-列对。在生成 DLL 期间做出的另一个重要决定是为列选择数据类型。这个工具做出默认的选择。下面的表给出当遇到某个 XML 模式类型时将要为列选择的 DB2 类型。
|
Sno.
|
XML 模式元素/属性类型
|
DB2 目标列类型
|
|
anyType
|
VARCHAR(20)
|
|
anySimpleType
|
VARCHAR(20)
|
|
Duration
|
INTEGER
|
|
dateTime
|
TIMESTAMP*
|
|
time
|
TIME*
|
|
date
|
DATE*
|
|
gMonth
|
INTEGER
|
|
gYear
|
INTEGER
|
|
gYearMonth
|
INTEGER
|
|
boolean
|
CHAR(5)
|
|
base64Binary
|
BLOB(1M)
|
|
hexBinary
|
BLOB(1M)
|
|
anyURI
|
VARCHAR(128)
|
|
QName
|
VARCHAR(256)
|
|
NOTATION
|
VARCHAR(256)
|
|
float
|
DOUBLE
|
|
double
|
DOUBLE
|
|
decimal
|
DOUBLE
|
|
integer
|
BIGINT
|
|
long
|
BIGINT
|
|
int
|
INTEGER
|
|
short
|
SMALLINT
|
|
byte
|
SMALLINT
|
|
nonPositiveInteger
|
BIGINT
|
|
negativeInteger
|
BIGINT
|
|
nonNegativeInteger
|
BIGINT
|
|
positiveInteger
|
BIGINT
|
|
unsignedLong
|
BIGINT
|
|
unsignedInt
|
BIGINT
|
|
unsignedShort
|
INTEGER
|
|
unsignedByte
|
SHORT
|
|
string
|
VARCHAR(128)
|
|
normalizedString
|
VARCHAR(128)
|
|
token
|
VARCHAR(20)
|
|
language
|
VARCHAR(20)
|
|
Name
|
VARCHAR(20)
|
|
NCName
|
VARCHAR(20)
|
|
ID
|
VARCHAR(20)
|
|
IDREF
|
VARCHAR(20)
|
|
IDREFS
|
VARCHAR(20)
|
|
ENTITY
|
VARCHAR(20)
|
|
ENTITIES
|
VARCHAR(128)
|
|
NMTOKEN
|
VARCHAR(20)
|
|
NMTOKENS
|
VARCHAR(128)
|
|
union
|
VARCHAR(128)
|
|
list
|
VARCHAR(128)
| |
注意: * 表示把 db2-xdb:truncate 注释用于这些数据类型。这允许截断时区信息,因为 DB2 数据类型不支持时区。
|
当然,这是默认数据类型映射的表。可以通过修改生成的 DDL 语句更改它,或通过修改附加源 TableCreator.java 文件中的数组 XSD2DB2[] 来永久地更改它。
用法:
DefaultAnnotation primary_schema_doc.xsd defaultSQLSchemaName
|
此实用工具接收两项输入 —— 原始的 XML 模式文档和默认 SQL 模式(表位于其中)。根据上面描述的算法,这个工具将创建并向标准输出设备输出 DDL,同时插入相应的注释,把元素/属性映射到表-列。接着可以向 XSR 注册注释 XML 模式并允许分解。接着可以使用创建的 XSRObject 来分解 XML 文档。
参数
XML 模式:通过这个原始 XML 模式可以获得所有相关的模式文档。建议用户在运行此工具之前保留一份模式文档的副本,因为这个工具将修改原始模式文档和属于使用 xsd:include、xsd:import 或 xsd:redefine 引用的模式的任何文档。
第二个参数用来限制所有的表引用。
注意: 在 XML 模式存储库中允许分解时,对同一模式文档多次运行此工具将导致错误,因为在每次运行时工具将向同一组元素/属性添加同一组映射。
运行工具必须具备的环境
- Java™ Runtime Environment(JRE)1.4.2 或 JRE
1.5
- Eclipse Modeling Framework 的 Java 归档(JAR)文件
- XSD 插件的 JAR 文件
- xml4j-4_2_2 或等效的 Xerces-J JAR 文件
获取这些工具的链接列在 参考资料 中。
如何运行它
这个工具是用 Java 编写的,它可以运行在所有支持 JRE 的平台上。但是,为便于在 Windows® 平台上使用,提供了 .bat 文件。这个 .bat 文件设置 PATH 和
CLASSPATH 变量。应该在 CLASSPATH 中设置 JAR 文件的路径,并把 JDK 设置为与安装相一致。有两种 .bat 文件,也就是 DefAS_Eclipse.bat 和
DefAS_DB2DWB.bat。文件 DefAS_Eclipse.bat 是为直接从 www.eclipse.org 下载 Eclipse 和相关插件的用户定制的,DefAS_DB2DWB.bat 是为安装了 DB2 Developer
Workbench 的用户定制的。注意,如果在同一台机器上安装 DB2 Developer Workbench,会自动包含所有需要的插件。
样例
在 下载 一节附带的文件中也提供一个样例,把下载文件解压后,在 sample 子目录下能够找到这个样例。样例中包含原始的 XML 模式、已转换的注释 XML
模式和包含使用此工具生成的新关系模式的 DDL。
原始的 XSD 文件是 Order.xsd。
使用此工具创建的注释 XML 模式是 Order_AS.xsd。
新的关系模式是 Order.sql。
注意,在 Order_AS.xsd 中插入注释以后,为方便起见通过一个整齐输出的 XML 工具运行它。
工具的局限性
- 默认映射可能导致与实体间关联相关的信息丢失。例如,如果一个 complexType 类型的元素 PurchaseOrder 具有一个 complexType 类型的子元素 Customer,那么与购买订单相关的信息(如 POID、Date 等等)将被分解进 PurchaseOrder 表中,与 Customer 相关的信息(CustID、CustName 等等)将被存储在 Customers 表中。但是,某个顾客在购买订单的上下文中被引用的事实将丢失。但是,通过手动添加注释能够克服这种局限性。在此例中,可以通过创建另外一个存储关联 PO_Cust 的表来记录关联信息。然后把关于 POID 元素或属性的注释添加到 CustID 元素/属性,以便把它们映射到表 PO_Cust。
- 工具不支持递归的 XML 模式的注释。在这种情况下,可能从 JRE 获得一个指示进程用完堆栈空间的错误。
- 工具不使用很多注释结构。
运行样例的步骤
- 在任何 XML 模式上运行工具并捕获写到标准输出的 DDL。
- 运行 DDL 来创建新关系模式。
- 注册 XML 模式并允许使用以下的 CLP 命令分解它:
REGISTER XML SCHEMA order.xsd from
c:\xsd\order.xsd AS po.order COMPLETE ENABLE DECOMPOSITION |
- 如果成功地执行了步骤 3,则使用下面的命令分解 XML 文档:
DECOMPOSE XML DOCUMENT c:\xml\order.xml
XMLSCHEMA po.order VALIDATE |
或者调用存储过程来分解 XML 文档。存储过程及其描述如下所示:
xdbDecompXML ( rschema , xmlschemaname, xmldoc , documentid , validation ,
reserved , reserved ,reserved ) |
rschema
: 在其中创建 XSRObject 的关系模式。XSRObject 作为注册和完成 XML 模式的结果被创建,在此例中为了分解而注释 XML 模式。
xmlschemaname
: XSRObject 的名称,XSRObject 包含通过注释描述应该如何分解 XML 文档的 XML 模式。
xmldoc
: 此参数是 BLOB 类型的,用于传递要分解的 XML 文档。
documentid
: XML 文档的标识符。它用来报告 db2diag.log 中的诊断信息并作为错误信息的一部分返回。
validation
: 如果分解 XML 文档时需要验证,应该把它设置为 1。否则应该把它设置为 0。
reserved
: 所有保留的参数应该作为 null 传递。
根据将要分解的 XML 文档的大小,此存储过程有五种变体。除了用来传递 XML 文档的 BLOB 的大小不同之外,所有的变体具有相同的参数。表 2 描述此存储过程的不同变体:
表 2. 存储过程的不同变体
|
存储过程名称
|
可以分解的最大文档大小
| |
SYSPROC.XDBDECOMPXML
|
1MB
| |
SYSPROC.XDBDECOMPXML10MB
|
10MB
| |
SYSPROC.XDBDECOMPXML25MB
|
25MB
| |
SYSPROC.XDBDECOMPXML50MB
|
50MB
| |
SYSPROC.XDBDECOMPXML75MB
|
75MB
| |
SYSPROC.XDBDECOMPXML100MB
|
100MB
|
注意,注释 XML 模式存储过程属于 SYSPROC 模式并且是内置的。正如 XML Extender 一样,使用它不需要激活数据库。
这四步可以用作分解文档的模板。可能出现的惟一差异是当 XML 模式由多个 XML 模式文档组成时,因为需要在结束 XML 模式前注册所有的模式文档。
结束语
注释 XML 模式分解是 DB2 Viper 版本中引入的新功能。它是使用新的算法编写的并引入了新的映射语言。映射语言和算法一起提供更加具有可伸缩性、高效和系统化的分解 XML 文档的方法。它允许将与目标关系模式在外形上显著不同的 XML 模式分解。工具 DefaultAnnotater 允许创建默认关系模式并在 XML 模式中插入相应的注释,从而快速开始使用新功能。这个工具也有助于快速学习关于注释 XML 模式分解的各种结构。
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Source and sample for DefaultAnnotater tool | DefaultAnnotater.zip | 25KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | Mayank Pradhan 是 IBM 的高级软件工程师,在 XML 技术组工作。他目前是注释 XML 模式分解功能开发团队的成员,该分解功能正被引入到 DB2 Viper 中。他以前是 XML Extender 开发团队的成员。 |
对本文的评价
|