Schema
一、简介
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
XML Schema:
定义可出现在文档中的元素
定义可出现在文档中的属性
定义哪个元素是子元素
定义子元素的次序
定义子元素的数目
定义元素是否为空,或者是否可包含文本
定义元素和属性的数据类型
定义元素和属性的默认值以及固定值
XML Schema 是 DTD 的继任者:
XML Schema 可针对未来的需求进行扩展
XML Schema 更完善,功能更强大
XML Schema 基于 XML 编写
XML Schema 支持数据类型
XML Schema 支持命名空间
二、为何使用?
2.1、XML Schema支持数据类型
通过对数据类型的支持:
可更容易地描述允许的文档内容
可更容易地验证数据的正确性
可更容易地与来自数据库的数据一并工作
可更容易地定义数据约束(data facets)
可更容易地定义数据模型(或称数据格式)
可更容易地在不同的数据类型间转换数据
附注:数据约束,或称 facets,是 XML Schema 原型中的一个术语,中文可译为“面”,用来约束数据类型的容许值。
2.2、XML Schema使用XML语法
由XML编写XML Schema的好处
不必学习新的语言
可使用 XML 编辑器来编辑 Schema 文件
可使用 XML 解析器来解析 Schema 文件
可通过 XML DOM 来处理 Schema
可通过 XSLT 来转换 Schema
2.3、XML Schema可保护数据通道
当数据从发送方被发送到接受方时,其要点是双方应有关于内容的相同的“期望值”。
通过 XML Schema,发送方可以用一种接受方能够明白的方式来描述数据。
一种数据,比如 "03-11-2004",在某些国家被解释为11月3日,而在另一些国家为当作3月11日。
但是一个带有数据类型的 XML 元素,比如:<date type="date">2004-03-11</date>,可确保对内容一致的理解,这是因为 XML 的数据类型 "date" 要求的格式是 "YYYY-MM-DD"。
2.4、XML Schema可扩展
XML Schema 是可扩展的,因为它们由 XML 编写。
在其他 Schema 中重复使用写好的 Schema
创建由标准类型衍生而来的自己的数据类型
在相同的文档中引用多重的 Schema
2.5、符合 XML 语法的文档称为形式良好的 XML 文档
它必须以 XML 声明开头
它必须拥有唯一的根元素
开始标签必须与结束标签相匹配
元素对大小写敏感
所有的元素都必须关闭
所有的元素都必须正确地嵌套
必须对特殊字符使用实体
三、XSD 如何使用
DTD文件:
<!ELEMENT note (to, from, heading, body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
对于DTD的引用:
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "http://www.w3schools.com/dtd/note.dtd"> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
XML Schema:
<schema>是每一个 XML Schema 的根元素。
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" xmlns="http://www.w3school.com.cn" elementFormDefault="qualified"> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
对XML Schema的引用
<?xml version="1.0"?> <note xmlns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com note.xsd"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
四、XSD - <schema>元素
<schema> 元素是每一个 XML Schema 的根元素。
<shcmea>元素可包含属性,一个schema声明类似如下:
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.runoob.com" xmlns="http://www.runoob.com" elementFormDefault="qualified"> ... ... </xs:schema>
属性说明:
xmlns:xs="http://www.w3.org/2001/XMLSchema"
schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。
同时还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs。
targetNamespace="http://www.w3school.com.cn"
schema 定义的元素 (note, to, from, heading, body) 来自命名空间: "http://www.w3school.com.cn"。
xmlns="http://www.w3school.com.cn"
指出默认的命名空间是 "http://www.w3school.com.cn"。==》声明的约束应用于此名称空间。
elementFormDefault="qualified"
指出任何 XML 实例文档(note.xml中引用了note.xsd)所使用的且在此 schema 中声明过的元素(note, to, from, heading, body)必须被命名空间限定。
在XML文档中引用Schema:
<?xml version="1.0"?> <note xmlns="http://www.w3school.com.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3school.com.cn note.xsd"> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
属性说明:
xmlns="http://www.w3school.com.cn"
规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 "http://www.w3school.com.cn" 这个命名空间。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
拥有了可用的 XML Schema 实例命名空间
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
拥有了xmlns:xsi实例。就可以使用 schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置:

五、XSD简易元素
什么是简易元素
简易元素指那些只包含文本的元素。它不会包含任何其他的元素或属性。
定义简易元素
语法:
<xs:element name="xxx" type="yyy"/>
常用的类型:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
<lastname>Refsnes</lastname> <age>36</age> <dateborn>1970-03-27</dateborn> 对应的简易元素定义: <xs:element name="lastname" type="xs:string"/> <xs:element name="age" type="xs:integer"/> <xs:element name="dateborn" type="xs:date"/>
简易元素的默认值和固定值:
<xsd:element name="color" type="xs:string" default="red"/>
<xsd:element name="color" type="xs:string" fixed="red"/>
六、XSD属性
什么是属性
简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。“
声明属性
语法:
<xsd:attribute name="xxx" type="yyy"/>
属性的默认值和固定值
<xs:attribute name="lang" type="xs:string" default="EN"/>
<xs:attribute name="lang" type="xs:string" fixed="EN"/>
可选和必须的属性
<xs:attribute name="lang" type="xs:string" use="required"/>
对内容的限定
当 XML 元素或属性拥有被定义的数据类型时,就会向元素或属性的内容添加限定。
假如 XML 元素的类型是 "xs:date",而其包含的内容是类似 "Hello World" 的字符串,元素将不会(通过)验证。
可向 XML 元素及属性添加自己的限定。这些限定被称为 facet(意为(多面体的)面,可译为限定面)。
七、XSD限定/Facets
限定(restriction)用于为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。
对值的限定
<xsd:element name="age"> <xsd:simpleType> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="0"/> <xsd:maxInclusive value="120"/> </xsd:restriction> </xsd:simpleType> </xsd:element>
对一组值的限定
如需把 XML 元素的内容限制为一组可接受的值,我们要使用枚举约束(enumeration constraint)。
<xs:element name="car"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Audi"/> <xs:enumeration value="Golf"/> <xs:enumeration value="BMW"/> </xs:restriction> </xs:simpleType> </xs:element> 上述事例也可被写成: <xs:element name="car" type="carType"/> <xs:simpleType name="carType"> <xs:restriction base="xs:string"> <xs:enumeration value="Audi"/> <xs:enumeration value="Golf"/> <xs:enumeration value="BMW"/> </xs:restriction> </xs:simpleType>
对一系列值的限定
如需把 XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)。
<xs:element name="letter"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpleType> </xs:element>
对一系列值的其他限定
使用正则表达式
对空白字符的限定
如需规定对空白字符(whitespace characters)的处理方式,需要使用 whiteSpace 限定。
preserve(保留): XML 处理器不会移除任何空白字符
replace:XML 处理器将移除所有空白字符(换行、回车、空格以及制表符)。
collapse:XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)。
对于长度的限定
如需限制元素中值的长度,需要使用 length、maxLength 以及 minLength 限定。
数据类型的限定
限定 描述
enumeration 定义可接受值的一个列表
fractionDigits 定义所允许的最大的小数位数。必须大于等于0。
length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive 定义数值的上限。所允许的值必须小于此值。
maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。
maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive 定义数值的下限。所允许的值必需大于此值。
minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern 定义可接受的字符的精确序列。
totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。
八、XSD符合元素
8.1、什么是符合元素
复合元素包含了其他的元素及/或属性。
8.2、有四种类型的符合元素:
空元素
包含其他元素的元素
仅包含文本的元素
包含元素和文本的元素
8.3、复合元素的例子
复合元素,"product",是空的: <product pid="1345"/> 复合元素,"employee",仅包含其他元素: <employee> <firstname>John</firstname> <lastname>Smith</lastname> </employee> 复合 XML 元素,"food",仅包含文本: <food type="dessert">Ice cream</food> 复合XML元素,"description"包含元素和文本: <description> It happened on <date lang="norwegian">03.03.99</date> .... </description>
8.4、如何定义复合元素
<employee> <firstname>John</firstname> <lastname>Smith</lastname> </employee>
8.4.1、通过命名此元素,可直接对”employee“元素进行声明
<xs:element name="employee"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
8.4.2、”employee“元素可以使用type属性,这个属性的的作用是引用要使用的符合类型的名称。
<xs:element name="employee" type="personinfo"/> <xs:complexType name="personinfo"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType>
如果使用上述的方法,那么若干元素均可以使用相同的符合类型。
<xs:element name="employee" type="personinfo"/> <xs:element name="student" type="personinfo"/> <xs:element name="member" type="personinfo"/> <xs:complexType name="personinfo"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType>

浙公网安备 33010602011771号