XML数据验证:W3CSchema全面解析
立即解锁
发布时间: 2025-08-17 01:23:54 阅读量: 2 订阅数: 15 

### XML数据验证:W3C Schema全面解析
#### 1. 引言
在XML数据验证领域,DTD(文档类型定义)长期以来是许多开发者的首选工具。然而,W3C Schema在数据验证方面展现出了更强大的控制力。接下来将详细介绍W3C Schema,包括其结构、数据类型、元素以及如何验证XML数据。
#### 2. W3C XML Schemas概述
W3C XML Schemas是一种用于XML数据验证的更新文档格式。相较于DTD,它不那么晦涩难懂,但更为冗长。由于其更贴近XML语法,XML开发者更容易掌握。在Schema中,嵌套元素通过嵌套元素表示,属性作为元素的一部分被明确指定。同时,它对数据类型的控制能力更强。
#### 3. W3C Schema数据类型
DTD作为原始SGML规范的一部分开发而来,并用于描述HTML标记。虽然它是一种传统的数据验证工具,但在应用于现代XML文档时存在一些缺点,例如对元素类型的限制以及对预定义数据类型的支持有限。
而Schema可以支持所有DTD属性数据类型(如ID、IDREF、IDREFS等),CDATA被原始字符串数据类型取代。以下是一些常见的Schema数据类型:
| 名称 | 基础类型 | 描述 |
| --- | --- | --- |
| String | String | 原始类型,任何格式良好的XML字符串 |
| normalizedString | string | 不包含换行符、回车符或制表符的格式良好的XML字符串 |
| Token | normalizedString | 不包含换行符、回车符、制表符、前导或尾随空格,且空格不超过一个的格式良好的XML字符串 |
| language | token | 有效的语言ID,符合xml:lang格式,通常为ISO 639格式 |
| QName | 原始类型 | XML命名空间限定名称(Qname) |
| Name | token | 基于格式良好的元素和属性名称规则的字符串 |
| NCName | name | 命名空间名称中命名空间前缀和冒号右侧的部分 |
| Date | date | 原始类型,格式为YYYY - MM - DD的日期值 |
| time | 原始类型 | 格式为HH:MM:SS的时间值 |
| dateTime | 原始类型 | 格式为YYYY - MM - DDT HH:MM:SS的日期和时间组合值 |
| gDay | 原始类型 | 格式为DD的日期中的日部分 |
| gMonth | 原始类型 | 格式为MM的日期中的月部分 |
| gMonthDay | 原始类型 | 格式为MM - DD的日期中的月和日部分 |
| gYear | 原始类型 | 格式为YYYY的日期中的年部分 |
| gYearMonth | 原始类型 | 格式为YYYY - MM的日期中的年和月部分 |
| duration | 原始类型 | 表示ISO 8601扩展格式P1Y1M1DT1H1M1S的时间间隔 |
| Numeric | number | 原始类型,最多18位小数的任何数值 |
| decimal | 原始类型 | 任何十进制数值 |
| float | 原始类型 | 任何32位浮点型实数 |
| double | 原始类型 | 任何64位浮点型实数 |
| integer | number | 任何整数 |
| byte | short | 任何有符号8位整数 |
| short | int | 任何有符号16位整数 |
| int | integer | 任何有符号32位整数 |
| long | integer | 任何有符号64位整数 |
| unsignedByte | integer | 任何无符号8位整数 |
| unsignedShort | unsignedInt | 任何无符号16位整数 |
| unsignedInt | unsignedLong | 任何无符号32位整数 |
| unsignedLong | nonNegativeInteger | 任何无符号64位整数 |
| positiveInteger | nonNegativeInteger | 任何大于0的整数 |
| nonPositiveInteger | integer | 任何小于或等于0的整数 |
| negativeInteger | nonPositiveInteger | 任何小于0的整数 |
| nonNegativeInteger | integer | 任何大于或等于0的整数 |
| anyURI | 原始类型 | 表示URI,可以包含任何URL或URN |
| Boolean | 原始类型 | 标准二进制逻辑,格式为1、0、true或false |
| hexBinary | 原始类型 | 十六进制编码的二进制数据 |
| base64Binary | 原始类型 | Base64编码的二进制数据 |
原始和派生数据类型可以扩展以创建新的数据类型,扩展现有数据类型的数据类型称为用户派生数据类型。
#### 4. W3C Schema元素
在Schema文档的元素声明中,数据类型以属性的形式呈现,就像在XML文档中数据类型通常由属性定义一样。数据类型包含在以下四种元素中:
- **元素声明**:描述XML文档中的元素。
- **简单类型定义**:包含单个元素中的值,通常具有定义原始或派生W3C数据类型的属性,也可以包含用户派生数据类型。
- **复杂类型定义**:一系列嵌套元素,具有描述复杂XML文档结构和原始、派生或用户派生数据类型的属性。
- **属性声明**:描述属性并定义属性数据类型的元素。
这些元素通过声明以下Schema元素来定义:
| 元素 | 描述 |
| --- | --- |
| all | 嵌套元素可以以任何顺序出现。每个子元素是可选的,且最多出现一次 |
| annotation | Schema注释,包含appInfo和documentation |
| appInfo | 用于解析和目标应用程序的信息,必须是annotation的子元素 |
| documentation | Schema文本注释,必须是annotation的子元素 |
| any | 任何格式良好的XML类型都可以以任何顺序嵌套在any元素下,与DTD的<!ELEMENT element_name ANY >声明相同 |
| anyAttribute | 任何由格式良好的XML组成的属性都可以以任何顺序嵌套在anyAttribute元素下 |
| attribute | 一个属性 |
| attributeGroup | 用于复杂类型定义的可重用属性组 |
| choice | 一个选择列表,必须选择其中一个,与DTD选择列表中使用竖线字符(|)相同 |
| complexContent | 复杂类型中混合内容或元素的定义 |
| complexType | 复杂类型元素 |
| element | 元素 |
| extension | 扩展简单类型或复杂类型 |
| field | 用于约束引用的元素或属性,类似于DTD的IDREF属性数据类型,但使用XPATH表达式进行引用 |
| group | 用于复杂类型定义的元素组 |
| import | 导入具有不同命名空间的外部Schema |
| include | 包含具有相同命名空间的外部Schema |
| key | 将嵌套属性或元素定义为唯一键,与DTD的ID属性数据类型相同 |
| keyref | 引用键元素,与DTD的IDREF属性数据类型相同 |
| list | 简单类型元素中的值列表 |
| notation | 定义XML文档中非解析数据的格式,与DTD的NOTATION属性数据类型相同 |
| restriction | 对简单类型、简单内容或复杂内容元素施加限制 |
| schema | 每个W3C Schema文档的根元素 |
| selector | 使用XPath表达式对一组元素进行分组以进行身份约束 |
| sequence | 指定子元素的严格顺序,与DTD序列中使用逗号分隔嵌套元素相同 |
| simpleContent | 简单类型中仅包含文本的内容定义 |
| simpleType | 声明简单类型定义 |
| union | 将简单类型组合成单个值的联合 |
| unique | 将元素或属性定义为在文档的指定嵌套级别上唯一 |
#### 5. W3C Schema元素和数据类型限制
除了上述元素外,还有一些元素用于定义Schema中其他元素的约束。简单数据类型的属性(包括约束)称为方面(facets)。简单数据类型可以通过基本方面进行约束,这些方面指定数据类型的基本约束,如显示顺序或基数。以下是一些W3C Schema基本方面的列表:
| 限制 | 描述 |
| --- | --- |
| choice | Schema文档中预定义的选择列表,与DTD属性列表数据类型的枚举相同 |
| fractionDigits | 值的最大小数位数,整数为0 |
| length |
0
0
复制全文
相关推荐









