1 XML Schema概述
1.1 XML Schema的功能
Ø 定义可出现在文档中的元素
Ø 定义可出现在文档中的属性
Ø 定义哪个元素是子元素
Ø 定义子元素的次序
Ø 定义子元素的数目
Ø 定义元素是否为空,或者是否可包含文本
Ø 定义元素和属性的数据类型
Ø 定义元素和属性的默认值以及固定值
1.2 XML Schema与DTD比较
Ø XML Schema 可针对未来的需求进行扩展
Ø XML Schema 更完善,功能更强大
Ø XML Schema 基于XML编写
Ø XML Schema 支持数据类型
Ø XML Schema 支持命名空间
1.3 XML Schema数据支持特点
Ø 可更容易地描述允许的文档内容
Ø 可更容易地验证数据的正确性
Ø 可更容易地与来自数据库的数据一并工作
Ø 可更容易地定义数据约束(data facets)
Ø 可更容易地定义数据模型(或称数据格式)
Ø 可更容易地在不同的数据类型间转换数据
2 XSD元素
2.1 命名空间
本章节举例:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://schema.example.com/schema/example" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace=" http://schema.example.com/schema/example" />
Ø xmlns
A. 命名空间类似于java的包package概念,它的主要目的也是为了解决名字冲突。
B. 命名空间被声明为元素的属性。并不一定只在根元素声明命名空间;而是可以在 XML 文档中的任何元素中进行声明。声明的命名空间的范围起始于声明该命名空间的元素,并应用于该元素的所有内容,直到被具有相同前缀名称的其他命名空间声明覆盖—其中,元素内容是指该元素的 <opening-tag> 和 </closing-tag> 之间的内容。命名空间声明如下:
<someElement xmlns:pfx="http://www.foo.com" />
C. 命名空间的名字不一定需要URL的形式
D. “xmlns”定义了命名空间,如上例就定义了本XSD的命名空间为
http://schema.example.com/schema/example
E. 一个XSD可以没有命名空间。在一个XSD文件中,没有前缀限定的元素默认引用的是”xmlns”指定的命名空间的元素;命名空间“http://www.w3.org/2001/XMLSchema”是由w3c 定义的,它定义了element、schema、complextType等等一大批元素,当我们要使用这些元素或它定义的变量时,就必须引用该命名空间。
F. 通常为了书写的简单,我们对一个命名空间进行缩写或称为起个别名。
Ø 默认命名空间与无命名空间
如果范围中没有默认命名空间,便不存在命名空间。{默认命名空间} 是使用 xmlns 显式声明的命名空间。如果未使用 xmlns 声明 {默认命名空间},则不能说元素位于 {默认命名空间} 中。这种情况下,我们可以说元素位于 {无命名空间} 中。当已声明的 {默认命名空间} 被取消声明时,也将应用 {无命名空间}。
摘要:
- 声明的命名空间的范围起始于声明该命名空间的元素,并应用于该元素的所有内容,直到被具有相同前缀名称的其他命名空间声明覆盖
- 带前缀的命名空间和 {默认命名空间} 都可以被覆盖。
- 带前缀的命名空间和 {默认命名空间} 都可以被取消声明。
- {默认命名空间} 不直接应用于属性,因此要将命名空间应用于属性,必须显式使用限定前缀。
- 仅当显式声明 {默认命名空间} 时,该命名空间才存在。如果未声明默认命名空间,则不应使用术语 {默认命名空间}。
- 如果范围中没有默认命名空间,便不存在命名空间。
Ø 命名空间缩写
“命名空间缩写“有的地方又称命名空间前缀;类似于给某个事件起个别名,它使用指令
xmlns:xsd=” http://www.w3.org/2001/XMLSchema”指定,
例子就指定了” http://www.w3.org/2001/XMLSchema”的缩写为xsd,所以当我们使用xsd:schema时,就是使用了命名空间“http://www.w3.org/2001/XMLSchema”定义的元素schema。如果需要可以在一个XSD中,使用“xmls:aliaseNameXX”来定义多个命名空间的缩写。
Ø 目标命名空间
在XSD中用”targetNamespace”指令定义的是目标命名空间,一个XSD中只能有一个目标命名空间;通常我们用w3c已定义的元素来构建新的元素,而这些新的元素就保留在目标命名空间中。一个XSD可以没有目标命名空间,但却不能给它指定一个空URL,这时,该XSD构建的元素和属性就保留在无目标命名空间中。要验证相应的 XML 实例,相应的 XML 实例必须使用 http://www.w3.org/2001/XMLSchema-instance 命名空间中的 noNamespaceSchemaLocation 属性来引用没有目标命名空间的 XML 模式。
Ø 取消命名空间
Namespaces in XML 1.0 W3C 推荐标准不允许取消绑定已经绑定的前缀,而 Namespaces in XML 1.1 W3C 推荐标准则允许这样做。1.0 没有理由不允许取消绑定,不过该错误已经在 1.1 中得到修正。不必知道此差别,这是因为支持 Namespaces in XML 1.1 的 XML 分析器并不多。
尽管取消绑定带前缀的命名空间有一些差别,但这两个版本均允许您取消绑定或删除已声明的 {默认命名空间}:用其他 {默认命名空间} 声明(覆盖声明中的命名空间为空)覆盖已声明的 {默认命名空间}。取消绑定命名空间与未声明命名空间具有同样的效果。此处的 Sherlock Holmes - III 和 Sherlock Holmes - I 的元素 Book、Title 和 Author 与命名空间 http://www.library.com 关联,而 Sherlock Holmes - II 的元素 purchase、Title 和 Author {没有命名空间}:
<someElement xmlns="" />
<?xml version="1.0"?>
<Book xmlns="http://www.library.com">
<Title>Sherlock Holmes - I</Title>
<Author>Arthur Conan Doyle</Author>
<purchase xmlns="">
<Title>Sherlock Holmes - II</Title>
<Author>Arthur Conan Doyle</Author>
</purchase>
<Title>Sherlock Holmes - III</Title>
<Author>Arthur Conan Doyle</Author>
</Book>
此处是根据 XML 1.0 规范中的命名空间取消绑定前缀的无效示例,而根据 XML 1.1 中的命名空间取消绑定前缀则是有效的:
<purchase xmlns:lib="">
从此处开始,前缀 lib 不能在 XML 文档中使用,因为只要您在元素 purchase 的范围内,它就保持未声名状态。当然,您完全可以再次定义它。
Ø elementFormDefault限定与未限定
在 XML 模式中,可以选择指定实例文档是必须限定所有元素和属性,还是只限定全局声明的元素和属性。无论做出什么样的选择,都将验证整个实例。这样做的目的是:“可管理性”。当我们选择限定时,我们指定实例中的所有元素和属性都必须有一个命名空间,这将增强实例的命名空间复杂性。比如,当因将某些局部声明变为全局声明和将某些全局声明变为局部声明而修改了模式时,根本不会影响实例文档。相反,如果选择非限定,则指定只有实例中全局声明的元素和属性才必须具有命名空间,从而隐藏实例的命名空间复杂性。但在此情形下,比如,当因将某些局部声明变为全局声明和将某些全局声明变为局部声明而修改了模式时,将影响所有实例文档 ——且实例不再有效。如果试图根据已修改的 XML 模式验证该实例,则 XML 模式验证器将报告验证错误。因此,必须根据 XML 模式中所作的修改修正命名空间,才能重新使该实例有效。
<?xml version="1.0" encoding="US-ASCII"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.library.com"
targetNamespace="http://www.library.com"
elementFormDefault="qualified">
attributeFormDefault="unqualified">
<element name="Book" type="tns:BookType" />