新的 XML Schema 系统即将成为 W3C 推荐标准,目的是为了克服 DTD 的局限性(请参阅侧栏, DTD 的局限性 ),为 XML 文档提供丰富的语法结构。本文展示了模式的灵活性,说明如何使用 XML Schema 系统来定义最基本的 XML 文档构造块——元素。
XML Schema 比 DTD 更强大。为了说明 XML Schema 机制的强大功能,下面三个程序清单简要比较了表示元素的不同方式。 清单 1给出了一个 XML 文档片段, 清单 2用 DTD 语法声明了这两个元素, 清单 3则是相应的 XML Schema 语法形式。要注意, 清单 3中所用的是相同的 XML 语法。通过模式,验证解析器可以检查元素 InvoiceNo 是否是正整数,元素 ProductID 的首字符是否为 A 到 Z 之间的字母,后面为六个阿拉伯数字。相反,引用 DTD 的验证解析器只能检查这些元素是否用字符串表示。
清单 1:XML 文档片段
以下是引用片段:
<InvoiceNo>123456789</InvoiceNo>
<ProductID>J123456</ProductID>
清单 2:描述清单 1 中元素的 DTD 片段
以下是引用片段:
<!ELEMENT InvoiceNo (#PCDATA)>
<!ELEMENT ProductID (#PCDATA)>
清单 3:描述清单 1 中元素的 XML Schema
以下是引用片段:
<element name='InvoiceNo' type='positive-integer'/>
<element name='ProductID' type='ProductCode'/>
<simpleType name='ProductCode' base='string'>
<pattern value='[A-Z]{1}d{6}'/>
</simpleType>
在 XML Schema 中使用名称空间
在这个协作的世界中,一个人可能处理来自多个其他团体的文档,而不同的团体可能希望以不同的方式表示他们的数据元素。此外,他们还可能在一个文档中引用不同团体创建的同名元素。如何区分相同名字的不同定义呢?XML Schema 使用名称空间区分这些定义。
附:
DTD 的局限性
(尽管作为描述结构化信息的一种机制,DTD 成功地为 SGML 和 HTML 开发人员服务了 20 年,但与 XML Schema 相比,它存在着严重的局限性。
DTD 要求元素由以下三种成分组成:
文本字符串
文本字符串与其他子元素的混合
一组子元素
DTD 不使用 XML 语法,对类型和名称空间仅提供有限的支持。
一个给定的 XML Schema 定义了一组新名字,如元素名、类型名、属性名、属性组名,这些名字的定义和声明都写在模式中。 清单3定义的名字包括 InvoiceNo 、 ProductID 和 ProductCode 。
我们说模式中定义的名字属于它的 目标名称空间。名称空间本身有一个固定但没有限制的名字,必须符合 URL 语法。比如,对于清单3中模式片段,您可以把名称空间的名字设为: http://www.SampleStore.com/Account 。
名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL http://www.SampleStore.com/Account 根本没有指向任何文件,只是一个分配的名字。
模式中的定义和声明可能引用属于其他名称空间的名字。在本文中,我们称这些名称空间为 源名称空间。每个模式都有一个目标名称空间,但可能有多个源名称空间。名称空间的名字可能相当长,但在 XML 文档中通过 xmlns 声明可使用简写形式。为了说明这些概念,我们可以向前述 清单 4中的示例模式中添加更多的内容。
清单 4:目标名称空间和源名称空间
| 以下是引用片段: <!--XML Schema fragment in file schema1.xsd--> <xsd:schema targetNamespace='http://www.SampleStore.com/Account' xmlns:xsd='http://www.w3.org/1999/XMLSchema' xmlns:ACC= 'http://www.SampleStore.com/Account'> <xsd:element name='InvoiceNo' type='xsd:positive-integer'/> <xsd:element name='ProductID' type='ACC:ProductCode'/> <xsd:simpleType name='ProductCode' base='xsd:string'> <xsd:pattern value='[A-Z]{1}d{6}'/> </xsd:simpleType> |
清单 5:多个源名称空间,导入一个名称空间
| 以下是引用片段: <!--XML Schema fragment in file schema1.xsd--> <schema targetNamespace='http://www.SampleStore.com/Account' xmlns='http://www.w3.org/1999/XMLSchema' xmlns:ACC= 'http://www.SampleStore.com/Account' xmlns:PART= 'http://www.PartnerStore.com/PartsCatalog'> <import namespace='http://www.PartnerStore.com/PartsCatalog' schemaLocation='http://www.ProductStandards.org/repository/alpha.xsd'/> <element name='InvoiceNo' type='positive-integer'/> <element name='ProductID' type='ACC:ProductCode'/> <simpleType name='ProductCode' base='string'> <pattern value='[A-Z]{1}d{6}'/> </simpleType> <element name='stickyGlue' type='PART:SuperGlueType'/> |
清单 5中多了一个名称空间引用: http://www.PartnerStore.com/PartsCatalog 。这个名称空间不同于 targetNamespace 和标准名称空间。因此必须使用 import 声明元素引入,该元素的 schemaLocation 属性指明包含模式的文件位置。默认的名称空间是 http://www.w3.org/1999/XMLSchema ,它的 xmlns 声明没有名字。每个非限定的名字如 schema 和 element ,都属于默认名称空间 http://www.w3.org/1999/XMLSchema 。如果模式从一个名称空间中引用了多个名字,将其指定为默认名字空间更方便。
新的 XML Schema 系统即将成为 W3C 推荐标准,目的是为了克服 DTD 的局限性(请参阅侧栏, DTD 的局限性 ),为 XML 文档提供丰富的语法结构。本文展示了模式的灵活性,说明如何使用 XML Schema 系统来定义最基本的 XML 文档构造块——元素。
XML Schema 比 DTD 更强大。为了说明 XML Schema 机制的强大功能,下面三个程序清单简要比较了表示元素的不同方式。 清单 1给出了一个 XML 文档片段, 清单 2用 DTD 语法声明了这两个元素, 清单 3则是相应的 XML Schema 语法形式。要注意, 清单 3中所用的是相同的 XML 语法。通过模式,验证解析器可以检查元素 InvoiceNo 是否是正整数,元素 ProductID 的首字符是否为 A 到 Z 之间的字母,后面为六个阿拉伯数字。相反,引用 DTD 的验证解析器只能检查这些元素是否用字符串表示。
清单 1:XML 文档片段
以下是引用片段:
<InvoiceNo>123456789</InvoiceNo>
<ProductID>J123456</ProductID>
清单 2:描述清单 1 中元素的 DTD 片段
以下是引用片段:
<!ELEMENT InvoiceNo (#PCDATA)>
<!ELEMENT ProductID (#PCDATA)>
清单 3:描述清单 1 中元素的 XML Schema
以下是引用片段:
<element name='InvoiceNo' type='positive-integer'/>
<element name='ProductID' type='ProductCode'/>
<simpleType name='ProductCode' base='string'>
<pattern value='[A-Z]{1}d{6}'/>
</simpleType>
在 XML Schema 中使用名称空间
在这个协作的世界中,一个人可能处理来自多个其他团体的文档,而不同的团体可能希望以不同的方式表示他们的数据元素。此外,他们还可能在一个文档中引用不同团体创建的同名元素。如何区分相同名字的不同定义呢?XML Schema 使用名称空间区分这些定义。
附:
DTD 的局限性
(尽管作为描述结构化信息的一种机制,DTD 成功地为 SGML 和 HTML 开发人员服务了 20 年,但与 XML Schema 相比,它存在着严重的局限性。
DTD 要求元素由以下三种成分组成:
文本字符串
文本字符串与其他子元素的混合
一组子元素
DTD 不使用 XML 语法,对类型和名称空间仅提供有限的支持。
一个给定的 XML Schema 定义了一组新名字,如元素名、类型名、属性名、属性组名,这些名字的定义和声明都写在模式中。 清单3定义的名字包括 InvoiceNo 、 ProductID 和 ProductCode 。
我们说模式中定义的名字属于它的 目标名称空间。名称空间本身有一个固定但没有限制的名字,必须符合 URL 语法。比如,对于清单3中模式片段,您可以把名称空间的名字设为: http://www.SampleStore.com/Account 。
名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL 并不指向一个包含模式定义的文件。事实上,这个 URL http://www.SampleStore.com/Account 根本没有指向任何文件,只是一个分配的名字。
模式中的定义和声明可能引用属于其他名称空间的名字。在本文中,我们称这些名称空间为 源名称空间。每个模式都有一个目标名称空间,但可能有多个源名称空间。名称空间的名字可能相当长,但在 XML 文档中通过 xmlns 声明可使用简写形式。为了说明这些概念,我们可以向前述 清单 4中的示例模式中添加更多的内容。
清单 4:目标名称空间和源名称空间
| 以下是引用片段: <!--XML Schema fragment in file schema1.xsd--> <xsd:schema targetNamespace='http://www.SampleStore.com/Account' xmlns:xsd='http://www.w3.org/1999/XMLSchema' xmlns:ACC= 'http://www.SampleStore.com/Account'> <xsd:element name='InvoiceNo' type='xsd:positive-integer'/> <xsd:element name='ProductID' type='ACC:ProductCode'/> <xsd:simpleType name='ProductCode' base='xsd:string'> <xsd:pattern value='[A-Z]{1}d{6}'/> </xsd:simpleType> |
清单 5:多个源名称空间,导入一个名称空间
| 以下是引用片段: <!--XML Schema fragment in file schema1.xsd--> <schema targetNamespace='http://www.SampleStore.com/Account' xmlns='http://www.w3.org/1999/XMLSchema' xmlns:ACC= 'http://www.SampleStore.com/Account' xmlns:PART= 'http://www.PartnerStore.com/PartsCatalog'> <import namespace='http://www.PartnerStore.com/PartsCatalog' schemaLocation='http://www.ProductStandards.org/repository/alpha.xsd'/> <element name='InvoiceNo' type='positive-integer'/> <element name='ProductID' type='ACC:ProductCode'/> <simpleType name='ProductCode' base='string'> <pattern value='[A-Z]{1}d{6}'/> </simpleType> <element name='stickyGlue' type='PART:SuperGlueType'/> |
清单 5中多了一个名称空间引用: http://www.PartnerStore.com/PartsCatalog 。这个名称空间不同于 targetNamespace 和标准名称空间。因此必须使用 import 声明元素引入,该元素的 schemaLocation 属性指明包含模式的文件位置。默认的名称空间是 http://www.w3.org/1999/XMLSchema ,它的 xmlns 声明没有名字。每个非限定的名字如 schema 和 element ,都属于默认名称空间 http://www.w3.org/1999/XMLSchema 。如果模式从一个名称空间中引用了多个名字,将其指定为默认名字空间更方便。
发表评论 |
|||||||
|
|||||||
|
|
|||||||
推荐广告