在 DB2 中注册引用外部 DTD 的 XML Schema

DB2 pureXML 特性支持对 XML Scehma 的管理。但是 DB2 V9.5.6/V9.7.2 之前的版本中,对于引用了外部 DTD 的 XML Schema 的注册上有一些限制,容易是用户感到困惑。在 DB2 V9.5.6/V9.7.2 版本中,这一问题得到了完善的解决。本文将对此作详细的介绍。

刘长生, 软件工程师, IBM

刘长生,IBM CDL软件工程师,具有多年软件开发经验,曾从事组件库技术的研究,目前从事 DB2 pureXML 相关的开发工作。



2010 年 12 月 30 日

问题的由来

DB2 pureXML 是 DB2 V9 引入的极其重要的新特性,支持对 XML schema 的管理、验证和演进。用户可以将合法的 XML Schema 注册到 DB2 的 catalog 中,用来验证将要保存到数据库中的 XML 文档是否满足 XML Schema 定义的结构,同时已经注册到 DB2 catalog 之中的 XML Schema 可以平滑的演进。但是在 DB2 9.5.6 之前(如 DB2 9.5.5)和 DB2 9.7.2 之前(如 DB2 9.7.1)的版本中,对于待注册的 XML Schema 有一些要求,XML Schema 中不能引用外部 DTD,不能引用外部实体(Entity)。这一限制在 DB2 9.5.6/9.7.2 版本中已经被去除,即用户可以注册引用外部 DTD 或实体的 XML Schema。本文将以 XML Schema 引用外部 DTD 为例,对这一变化进行较为深入的介绍。

1. XML Schema 和 DTD

XML Schema 和 DTD 都是用来描述 XML 文档结构的,实际上就是定义了一类 XML 文档的模板。XML Schema 规定了遵循该模式的 XML 文档中有哪些元素和属性、元素之间的层次关系、元素出现的次数和顺序、以及元素和属性的数据类型和取值等约束。而 DTD 则可以看作是 XML Schema 的前身,对 XML 文档的结构予以描述,除了定义元素和属性外,DTD 一个重要的功能是可以定义实体并在其他地方引用这些实体。清单 1 是一个简单的 XML 的文档。

清单 1. XML 文档示例
 <?xml version="1.0" encoding="UTF-8"?> 
 <component xmlns="http://www.w3.org/2009/09/componentBase"
 compID="101"> 
  <function>XML validator</function> 
 </component>

清单 2 和清单 3 分别是可以用来描述该 XML 文档的 XML Schema 和 DTD。

清单 2. 示例 XML 文档的 XML Schema
 <?xml version="1.0" encoding="UTF-8"?> 
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:cs="http://www.w3.org/2009/09/componentBase"
  targetNamespace="http://www.w3.org/2009/09/componentBase"
  elementFormDefault="qualified"> 

  <element name="component" type="cs:ComponentType"/> 
  <complexType name="ComponentType"> 
  <sequence> 
  <element name="function" type="string"/> 
  </sequence> 
  <attribute name="compID" type="string" use="required"/> 
  </complexType> 

 </schema>
清单 3. 示例 XML 文档的 DTD
 <!ELEMENT component (function)> 
 <!ATTLIST component compID CDATA #REQUIRED> 

 <!ELEMENT function (#PCDATA)>

2. XML Schema 对外部 DTD 的引用

XML Schema 是用来描述 XML 文档结构的,但其本身也是一个 XML 文档,所以 XML Schema 的语法规范可以使用 DTD 来描述。XML Schema 也可以引用外部 DTD。W3C 给出了完整描述 XML Schema 的 DTD,可以通过 http://www.w3.org/2001/XMLSchema.dtd获取,该 DTD 文档内容又引用了所有数据类型的描述文件 http://www.w3.org/2001/datatypes.dtd。在任何 XML Schema 中都可以引用外部 DTD,如 http://www.w3.org/2001/XMLSchema.dtd

在 XML Schema 中引用外部 DTD 有两种方式:(1)系统(SYSTEM)引用,(2)公共(PUBLIC)引用。系统引用遵循“<!DOCTYPE 根元素 SYSTEM SYSTEM_ID>”的格式,其中 SYSTEM_ID 可以是(包含路经的)文件名,可以是一个 URI,对应的文件就是被引用的 DTD;公共引用则采用 “<!DOCTYPE 根元素 PUBLIC PUBLIC_ID URI>”格式,其中 PUBLIC_ID 是被引用公用 DTD 唯一的公共标识,URI 是被引用 DTD 的统一资源标识,通过该 URI 可以访问到被引用的 DTD。清单 4 和清单 5 分别给出了在 XML Schema 中系统引用和公共引用 XMLSchema.dtd。

清单 4. 在 XML Schema 中系统引用外部 DTD
 <?xml version="1.0" encoding="utf-8"?> 
 <!DOCTYPE schema 
  SYSTEM "XMLSchema.dtd"
 > 
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:cs="http://www.w3.org/2009/09/componentBase"
  targetNamespace="http://www.w3.org/2009/09/componentBase"
  elementFormDefault="qualified"> 

  <element name="component" type="cs:ComponentType"/> 
  <complexType name="ComponentType"> 
  <sequence> 
  <element name="function" type="string"/> 
  </sequence> 
  <attribute name="compID" type="string" use="required"/> 
  </complexType> 

 </schema>
清单 5. 在 XML Schema 中公共引用外部 DTD
 <?xml version="1.0" encoding="utf-8"?> 
 <!DOCTYPE schema 
  PUBLIC "-//W3C//DTD XMLSchema 200102//EN" 
  "http://www.w3.org/2001/XMLSchema.dtd"
 > 
 <schema xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:cs="http://www.w3.org/2009/09/componentBase"
  targetNamespace="http://www.w3.org/2009/09/componentBase"
  elementFormDefault="qualified"> 

  <element name="component" type="cs:ComponentType"/> 
  <complexType name="ComponentType"> 
  <sequence> 
  <element name="function" type="string"/> 
  </sequence> 
  <attribute name="compID" type="string" use="required"/> 
  </complexType> 

 </schema>


此外,DTD 文档本身也可以引用另一个 DTD 文档,引用方式与 XML Schema 对外部 DTD 的引用类似,也分为系统引用和公共引用两种,比如本文前面介绍的 XMLSchema.dtd 中就公共引用了 datatypes.dtd,见清单 6。

清单 6. 在 DTD 中公共引用外部 DTD
 <!ENTITY % xs-datatypes PUBLIC 'datatypes' 'datatypes.dtd' >

在 XML 应用的开发过程中,我们往往使用一些工具来帮助我们生成一些企业标准或行业标准的 XML 文件的模板规范,即 XML Schema。在工具生成的 XML Schema 中有的就含有对外部 DTD 即 XMLSchema.dtd 的引用。在将这类 XML Schema 注册到 DB2 中时,用户往往会遇到一些问题。

3. DB2 用户在注册 XML Schema 时的困惑

在 DB2 9.5.6 或 9.7.2 版本之前,对要注册的 XML Schema 有所限制,但用户在注册含有外部 DTD 引用的 XML Schema 时,DB2 server 没有直接返回该类 XML Schema 注册不予支持的消息,而是依据外部 DTD 的引用方式,甚至是网络环境的不同,表现出不同的行为,返回给用户不一样的操作结果。所以,用户在注册这类 XML Schema 时往往会陷于迷茫,不太容易搞清楚究竟如何能够成功的注册 XML Schema,因为用户使用同样的 XML Schema 文件和 DB2 命令,在同一版本的不同 DB2 服务器上可能会产生不同的结果。我们将在下一节详细地剖析 DB2 9.5.6 或 9.7.2 之前的 DB2 版本的行为。


DB2 9.5.6/9.7.2 之前的行为

在 DB2 9.5.6/9.7.2 之前的版本,含有外部 DTD 引用的 XML Schema 的注册,没有得到很好的支持。无论外部 DTD 有没有被事先注册到 DB2 catalog 中,DB2 都不会尝试到 catalog 中读取 DTD,而是依据在 XML Schema 中对外部 DTD 的引用方式的不同,试图访问本地文件系统或访问远程网络。下面我们以 DB2 9.5.5 为例,予以介绍。

1. 访问本地文件系统

前面我们已经介绍过在 XML Schema 中可以有两种方式引用外部 DTD。当我们以系统引用的方式引用外部 DTD 时,DB2 server 会根据 SYSTEM ID 获取被引用的 DTD 文件,如果 SYSTEM ID 指向一个本地文件,则 DB2 访问本地文件系统。清单 7 显示了在没有事先注册外部 DTD 的情况下,注册含有系统引用该 DTD 的 XML Schema 的实验结果。

清单 7. 注册系统引用未注册的外部 DTD 的 XML Schema
 db2 "register xmlschema 'http://www.component_ref_system.com' from 
 component_ref_system.xsd as component_ref_system"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_system 
 SQL16104N Internal error encountered in XML parser. Parser error is 
"Gen_CouldNotOpenDTD". SQLSTATE=2200M

其中 component_ref_system.xsd 文件的内容如清单 4 所示。DB2 返回 SQL16104N 错误,消息"Gen_CouldNotOpenDTD"表明在访问本地文件系统时无法打开被引用的 DTD 文件。清单 8 显示了 DTD 已经被成功注册的情况下,注册系统引用该 DTD 的 XML Schema 的实验结果。

清单 8. 注册系统引用已注册的外部 DTD 的 XML Schema
 db2 "register xsrobject 'XMLSchema.dtd' from XMLSchema.dtd 
 as XMLSchema_system_dtd DTD"
 DB20000I The REGISTER XSROBJECT command completed successfully. 

 db2 drop xsrobject component_ref_system 
 DB20000I The SQL command completed successfully. 

 db2 "register xmlschema 'http://www.component_ref_system.com' from 
 component_ref_system.xsd as component_ref_system"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_system 
 SQL16104N Internal error encountered in XML parser. Parser error is 
"Gen_CouldNotOpenDTD". SQLSTATE=2200M

从清单 7 和清单 8 所示的结果可以看出,无论被引用的 DTD 没有被成功注册,都不会影响 DB2 试图访问本地文件系统来读取 DTD 文件。而在本地文件系统中找不到被引用的 DTD 文件时,返回 SQL16104N "Gen_CouldNotOpenDTD"错误。从系统设计和安全的角度考虑, 让 DB2 访问 DBMS 之外的文件是不合适的,相反,DB2 应该从 catalog 中寻找已经被注册的 DTD 并完成整个 XML Schema 的注册。

类似地,当我们采用公共引用的方式时,如果 PUBLIC ID 不是合法的,则 DB2 会通过 URI 来访问被引用的 DTD,如果 URI 以本地文件名的形式出现(当然,一般很少用户会这样使用),DB2 也将试图方式本地文件系统。

2. 访问远程网络

如果在 XML Schema 中以系统引用外部 DTD 时,STSTEM ID 是一个网络资源的 URI,或者以公共引用的方式引用 DTD 时,PUBLIC ID 和 URI 对指向一个有效的网络资源,那么 DB2 都将尝试从远程网络上获取该 DTD,不管被引用的 DTD 有没有已经被成功注册到 catalog 中。以公共引用方式为例,清单 9 和清单 10 给出了相应的实验结果。

清单 9. 注册公共引用未注册的外部 DTD 的 XML Schema
 db2 "register xmlschema 'http://www.component_ref_public.com' from 
 component_ref_public.xsd as component_ref_public"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_public 
 SQL16104N Internal error encountered in XML parser. Parser error is 
"NetAcc_ConnSocket". SQLSTATE=2200M
清单 10. 注册公共引用已注册的外部 DTD 的 XML Schema
 db2 "register xsrobject 'http://www.w3.org/2001/XMLSchema.dtd' 
 PUBLIC '-//W3C//DTD XMLSchema 200102//EN' from XMLSchema.dtd 
 as XMLSchema_public_dtd DTD"
 DB20000I The REGISTER XSROBJECT command completed successfully. 

 db2 drop xsrobject component_ref_public 
 DB20000I The SQL command completed successfully. 

 db2 "register xmlschema 'http://www.component_ref_public.com' from 
 component_ref_public.xsd as component_ref_public"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_public 
 SQL16104N Internal error encountered in XML parser. Parser error is 
"NetAcc_ConnSocket". SQLSTATE=2200M

其中,文件 component_ref_public.xsd 的内容如清单 5 所示。在清单 9 和清单 10 所示的实验中,在最后完成 XML Schema 注册时,我们发现需要等待一段时间后,DB2 返回错误 SQL16104N。从错误消息"NetAcc_ConnSocket",我们可以辨别这是发生的情况是 DB2 尝试建立 socket 连接,访问被引用 DTD 文件,但是尝试建立连接超时失败(如 URI 指定的远程主机不存在或不能通过网络防火墙等)。如果能够建立连接但所制定的资源不存在,则同样会返回含有其他具体错误情形的 SQL16104N 错误。

3. 网络环境对注册结果的影响

清单 9 和清单 10 所示的结果是因为实验所用的 DB2 server 与 Internet 之间存在具有高安全性要求的网络防火墙,不允许访问远程网络,导致 DB2 无法访问 http://www.w3.org/2001/XMLSchema.dtd。 如果我们在能够访问 Internet 的网络环境下,则 XML Schema 能够被成功的注册,不管被引用的 DTD 有没有已经被成功注册到 DB2 catalog 中。见清单 11。

清单 11. 注册公共引用可通过网络获取的外部 DTD 的 XML Schema
 db2 drop xsrobject component_ref_public 
 DB20000I The SQL command completed successfully. 

 db2 "register xmlschema 'http://www.component_ref_public.com' from 
 component_ref_public.xsd as component_ref_public"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_public 
 DB20000I The COMPLETE XMLSCHEMA command completed successfully.

所以,DB2 注册公共引用了外部 DTD 的 XML Schema 的结果依赖于 DB2 server 所在的网络环境。这使得 DB2 的运行引入了不稳定的因素,同时也会让用户感到非常的困惑,在相同 DB2 配置的的不同服务器上可能得到不同的运行结果。从系统设计和系统安全的角度考虑,DB2 同样应该从 catalog 中查找已注册的 DTD 并完成整个 XML Schema 的注册,而不应依赖于 DBMS 之外的资源。


DB2 9.5.6/9.7.2 之后的行为

在 DB2 9.5.6/9.7.2 之前的版本中,对于引用外部 DTD 的 XML Schema 的注册没有提供很好的支持,这一问题在 9.5.6 和 9.7.2 版本中得到了解决。DB2 不再访问本地文件系统或远程网络获取 SYSTEM ID 或 PUBLIC ID/URI 对指定的外部 DTD 文件,而是检查被引用的 DTD 是不是已经被成功注册到 DB2 catalog 中。如果 DTD 在没有被注册的情况下被引用,那么 DB2 将返回错误 SQL20330N,清单 12 和清单 13 分别显示了 XML Schema 系统引用和公共引用 DTD 的时的注册结果。

清单 12. 注册系统引用未注册 DTD 的 XML Schema
 db2 "register xmlschema 'http://www.component_ref_system.com' from 
 component_ref_system.xsd as component_ref_system"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_system 
 SQL20330N The "EXTERNAL ENTI" identified by the XML "SYSTEM ID" 
 "http://www.w3.org/2001/XMLSchema.dt" and XML "PUBLIC ID" "" 
 is not found in the XML schema repository. SQLSTATE=22532
清单 13. 注册公共引用未注册 DTD 的 XML Schema
 db2 "register xmlschema 'http://www.component_ref_public.com' from 
 component_ref_public.xsd as component_ref_public"
 
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_public 
 SQL20330N The "EXTERNAL ENTI" identified by the XML "SYSTEM ID"
"http://www.w3" and XML "PUBLIC ID" "-//W3C//DTD XMLSchema " is not found 
in the XML schema repository. SQLSTATE=22532

在前面的介绍中,外部 DTD 被引用时,可以有两种方式,即系统引用和公共引用。在 DB2 中,相应地,也有两种注册 DTD 的方式,参见下面的注册命令。

清单 14. 注册 DTD 的 DB2 命令
 >>-REGISTER XSROBJECT--system-ID--+------+------> 
 --- '-PUBLIC--public-ID-' 

 >--FROM--content-URI--+---------------+-------------> 
  '-AS--relational-identifier-' 

 >--+-----------+--------------->< 
  +-DTD-------------+ 
				 '-EXTERNAL ENTITY-'

其中, system-ID 是必需的参数,对应系统引用时指定外部 DTD 文件的 SYSTEM ID 或公共引用时指定 DTD 的 URI;public-ID 是可选的,用于指定被注册 DTD 的公用 ID,对应于 DTD 公共引用时指定的 PUBLIC ID。这里,我们姑且将只提供 system-ID 的注册方式称为系统注册方式,将同时提供 public-ID 的注册方式称为公共注册方式。这样,在 DTD 注册方式和 DTD 引用方式(包括在 XML Schema 和另一个 DTD 文档中引用)形成了如下几种情况:

  • 系统注册的 DTD 被系统引用
  • 公共注册的 DTD 被公共引用
  • 系统注册的 DTD 被公共引用
  • 公共注册的 DTD 被系统引用

下面我们将分别对这四种情形予以介绍。

1. 系统注册的 DTD 被系统引用

我们采用系统注册的方式在 DB2 中注册了 DTD 文档之后,我们就可以在 XML Schema(或其他 DTD)中以系统引用的方式引用。这时,这样的 XML Schema 能够成功的被注册。DB2 将从 catalog 中读取被引用的 DTD,并完成整个 XML Schema 的注册。清单 15 显示了在 XMLSchema.dtd 被系统注册之后,component_ref_system.xsd 被成功注册的结果。XMLSchema.dtd 被 component_ref_system.xsd 文件以系统引用的方式所引用。(在我们的例子中,被引用的 XMLSchema.dtd 文件中还公共引用了另一个 DTD 文件 datatypes.dtd,所以在系统注册 XMLSchema.dtd 之前,我们还必须先采用公共注册的方式注册 datatypes.dtd,参见下一节。)

清单 15. 注册系统引用已被系统注册的外部 DTD 的 XML Schema
 db2 "register xsrobject 'datatypes.dtd' PUBLIC 'datatypes' 
 from datatypes.dtd as datatypes_dtd DTD"
 DB20000I The REGISTER XSROBJECT command completed successfully. 

 db2 drop xsrobject XMLSchema_system_dtd 
 DB20000I The SQL command completed successfully. 

 db2 "register xsrobject 'XMLSchema.dtd' from XMLSchema.dtd 
 as XMLSchema_system_dtd DTD"
 DB20000I The REGISTER XSROBJECT command completed successfully. 

 db2 drop xsrobject component_ref_system 
 DB20000I The SQL command completed successfully. 

 db2 "register xmlschema 'http://www.component_ref_system.com' from 
 component_ref_system.xsd as component_ref_system"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_system 
 DB20000I The COMPLETE XMLSCHEMA command completed successfully.

2. 公共注册的 DTD 被公共引用

在 DB2 中以公共注册的方式注册 DTD 之后,自然地可以被 XML Schema 公共引用。(或被其他 DTD 引用,如清单 15 中 datatypes.dtd 的公共注册后被 XMLSchema.dtd 公共引用。)这样的 XML Schema 能够被注册到 DB2 中。清单 16 显示了注册结果。

清单 16. 注册公共引用已被公共注册的外部 DTD 的 XML Schema
 db2 "register xsrobject 'http://www.w3.org/2001/XMLSchema.dtd' 
 PUBLIC '-//W3C//DTD XMLSchema 200102//EN' from XMLSchema.dtd 
 as XMLSchema_public_dtd DTD"
 DB20000I The REGISTER XSROBJECT command completed successfully. 

 db2 drop xsrobject component_ref_public 
 DB20000I The SQL command completed successfully. 

 db2 "register xmlschema 'http://www.component_ref_public.com' from 
 component_ref_public.xsd as component_ref_public"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_public 
 DB20000I The COMPLETE XMLSCHEMA command completed successfully.

3. 系统注册的 DTD 被公共引用

在 DB2 中系统注册了 DTD 文档之后,系统引用该 DTD 的 XML Schema 能够被注册到 DB2 中,但是以公共引用方式引用了该 DTD 的 XML Schema 却不能被成功注册,因为 DB2 在 catalog 中无法查找到 PUBLIC ID 和 URI 对匹配的 DTD,而发生错误 SQL20330N。参见清单 17。

清单 17. 注册公共引用已被系统注册的外部 DTD 的 XML Schema
 db2 drop xsrobject XMLSchema_system_dtd 
 DB20000I The SQL command completed successfully. 

 db2 "register xsrobject 'http://www.w3.org/2001/XMLSchema.dtd' 
 from XMLSchema.dtd as XMLSchema_system_dtd DTD"
 DB20000I The REGISTER XSROBJECT command completed successfully. 

 db2 drop xsrobject component_ref_public 
 DB20000I The SQL command completed successfully. 

 db2 "register xmlschema 'http://www.component_ref_public.com' from 
 component_ref_public.xsd as component_ref_public"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_public 
 SQL20330N The "EXTERNAL ENTI" identified by the XML "SYSTEM ID" 
 "http://www.w3" and XML "PUBLIC ID" "-//W3C//DTD XMLSchema " 
 is not found in the XML schema repository. SQLSTATE=22532

注意,在注册 XMLSchema.dtd 时,我们已经将 system-ID 更改为在 XML Schema 定义文件 component_ref_public.xsd 中所引用的 SYSTEM ID,即 http://www.w3.org/2001/XMLSchema.dtd

4. 公共注册的 DTD 被系统引用

DB2 中以公共注册的方式注册的 DTD,如果被 XML Schema 采用系统引用的方式引用,那么与前一节讨论的一样,该 XML Schema 也同样不能被成功注册。结果如清单 18 所示。

清单 18. 注册系统引用已被公共注册的外部 DTD 的 XML Schema
 db2 "register xsrobject 'XMLSchema.dtd' PUBLIC
  '-//W3C//DTD XMLSchema 200102//EN' 
 from XMLSchema.dtd as XMLSchema_public_dtd DTD"
 DB20000I The REGISTER XSROBJECT command completed successfully. 

 db2 drop xsrobject component_ref_system 
 DB20000I The SQL command completed successfully. 

 db2 "register xmlschema 'http://www.component_ref_system.com' from 
 component_ref_system.xsd as component_ref_system"
 DB20000I The REGISTER XMLSCHEMA command completed successfully. 

 db2 complete xmlschema component_ref_system 
 SQL20330N The "EXTERNAL ENTITY" identified by the XML "SYSTEM ID"
  "XMLSchema.dtd" and XML "PUBLIC ID" "" is not found in
   the XML schema repository. SQLSTATE=22532

注意,在注册 XMLSchema.dtd 时,我们已经将 system-ID 更改为在 XML Schema 定义文件 component_ref_ system.xsd 中所引用的 SYSTEM ID,即 XMLSchema.dtd。DB2 根据 system-ID 和 public-ID 查询 catalog 仍然无法找到对应的 DTD,返回错误 SQL20330N。


小结

通过对比 DB2 9.5.6/9.7.2 之前和之后的行为,我们发现对于引用外部 DTD 的 XML Schema 的注册功能得到了显著的改进。在 DB2 9.5.6/9.7.2 之前的版本中,DB2 不关注被引用的 DTD 是否已经被注册,而是通过本地文件系统或远程网络获取 DTD 文件,从而使得数据库系统运行依赖于服务器所在的网络环境,引起用户不必要的困惑,具有系统安全的隐患;在 DB2 9.5.6/9.7.2 之后的版本中,DB2 不再访问本地文件系统或远程网络,而是检查被引用的 DTD 是不是已经被注册、注册方式以及被引用的方式,判定引用该 DTD 的 XML Schema 能否被注册,如下表所示。

表 1. DB2 新版本中注册引用外部 DTD 的 XML Schema 的行为
DTD 是否已注册 DTD 注册方式 DTD 引用方式 XML Schema 注册结果
未注册 —— —— SQL20330N
已注册 系统注册 系统引用 成功注册
已注册 公共注册 公共引用 成功注册
已注册 系统注册 公共引用 SQL20330N
已注册 公共注册 系统引用 SQL20330N

至此,我们完整的介绍了含有外部 DTD 引用的 XML Schema 的注册情况。对于 XML Schema 中含有外部实体(Entity)引用的情况与此类似,不再赘述。

参考资料

学习

获得产品和技术

  • 使用可直接从 developerWorks 下载的 IBM 产品评估试用软件 构建您的下一个开发项目。
  • 现在可以免费使用 DB2。下载 DB2 Express-C,这是为社区提供的 DB2 Express Edition 的免费版本,它提供了与 DB2 Express Edition 相同的核心数据特性,为构建和部署应用程序奠定了坚实的基础。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management, XML
ArticleID=605659
ArticleTitle=在 DB2 中注册引用外部 DTD 的 XML Schema
publish-date=12302010