经历了第一篇XML入门和第二篇DTD的理解,现在终于可以进入到XML Schema的学习了,正如前边提到的,Schema实际上可以说是DTD的一种扩展,一种替代品,或者可以说是DTD的一种优化。
Schema基础
Schema用途和能力
用途
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
能力
比较了下DTD和Schema的能力,我感觉其实二者完成的基本功能差别不大,均是为了定义合法的XML模块,可以说Schema是DTD的plus版本吧,更加易懂,易学,扩展性更好。
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序 ——————————-DTD不能定义无序情况
- 定义子元素的数目
- 定义元素是否为空,或者是否可包含文本
- 定义元素和属性的数据类型——————-Schema支持更多的数据类型
- 定义元素和属性的默认值以及固定值
Schema和DTD的比较
Schema显然是DTD的加强版,这里举出两个3C的实例比较,然后根据自己理解将区别特性对应上。依然使用之前的例子:
XML文档
<?xml version="1.0"?> <note> <name>茂神</name> <sex>男</sex> <age>24</age> <describe>茂神最帅了!</describe> </note>
DTD描述文件note.dtd
<!ELEMENT note (name,sex,age,describe)> //非XML结构,且子元素顺序是定死的,不支持命名空间 <!ELEMENT name (#PCDATA)> //元素仅能认定为 "#PCDATA" 类型 <!ELEMENT sex (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT describe (#PCDATA)> //整体文档结构平铺,结构性差,可读性差
Schema描述文件note.xsd
<?xml version="1.0"?> ==========================================//Schema使用XML的文档结构 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" ==================== //Schema支持命名空间 xmlns="http://www.w3school.com.cn" elementFormDefault="qualified"> <xs:element name="note"> <xs:complexType> <xs:sequence>===============================================//Schema支持子元素顺序 <xs:element name="name" type="xs:string"/> <xs:element name="sex" type="xs:string"/> <xs:element name="age" type="xs:integer"/>===================//整数型,Schema支持详细类型 <xs:element name="describe " type="xs:string"/>==============//字符串型,Schema支持详细类型 </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Schema 基于 XML 编写
Schema本身也是XML文档,DTD定义跟XML没有什么关系,Schema在理解和实际应用有很多的好处。Schema是XML文档,而DTD有自己的特殊语法这样,只需要懂得XML的语法规则就可以编写Schema,无须学习其他的语法规则;
Schema 文档结构直观
DTD文档的结构是“平铺型”的,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系;Schema文档结构性强,各元素之间的嵌套关系非常直观。
Schema 支持更多元素类型
DTD只能指定元素含有文本,不能定义元素文本的具体类型,如字符型、整型、日期型、自定义类型等。Schema在这方面比DTD强大。
Schema支持元素节点顺序描述
Schema支持元素节点顺序的描述,DTD没有提供无序情况的描述(子元素均需按顺序),要定义无序必需穷举排列的所有情况。Schema可以利用xs:all来表示无序的情况。
Schema支持命名空间
对命名空间的支持。DTD无法利用XML的命名空间,Schema很好满足命名空间。并且,Schema还提供了include和import两种引用命名空间的方法。
Schema使用
XML引入Schema
上篇博客已经详细解释过DTD是怎么被引入到XML中的:主要通过:<!DOCTYPE 根元素 SYSTEM "文件名">
的方式引入,传送门https://blog.csdn.net/sinat_33087001/article/details/80877507,上例中的XML要想引入DTD,那么只需要在XML中加一句:
<!DOCTYPE note SYSTEM "http://www.w3school.com.cn/dtd/note.dtd">
那么XML引入XSD呢,需要如下代码:
<?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"> <note> <name>茂神</name> <sex>男</sex> <age>24</age> <describe>茂神最帅了!</describe> </note>
对上边三句解释如下:
- xmlns=”http://www.w3school.com.cn” 规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 “http://www.w3school.com.cn” 这个命名空间。
- 一旦拥有了可用的 XML Schema 实例命名空间:xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” 就可以使用 schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间(也就是Schmea能发挥作用必须引入的实例这里讲的是Schema结构需要的哦)。第二个值是供命名空间使用的 XML schema 的位置这里讲的是Schema被用于的XML文档实际的命名空间哦:xsi:schemaLocation=”http://www.w3school.com.cn note.xsd”
Schema结构详解
继续拿上边3C举例的Schema来讨论Schema的各个结构:
<?xml version="1.0"?> ===================================//Schema使用XML的文档结构,所以需要xml声明 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3school.com.cn" ==================== //Schema支持命名空间 xmlns="http://www.w3school.com.cn" elementFormDefault="qualified"> <xs:element name="note"> <xs:complexType> <xs:sequence>===============================================//Schema支持子元素顺序 <xs:element name="name" type="xs:string"/> <xs:element name="sex" type="xs:string"/> <xs:element name="age" type="xs:integer"/>===================//整数型,Schema支持详细类型 <xs:element name="describe " type="xs:string"/>==============//字符串型,Schema支持详细类型 </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
首先,<schema>
元素是每一个 XML Schema 的根元素,而且<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:schema>
其中四句头部声明内容解释如下:
- xmlns:xs=”http://www.w3.org/2001/XMLSchema”表示 schema 中用到的元素和数据类型(这里讲的是Schema结构的元素和数据类型哦)来自命名空间 “http://www.w3.org/2001/XMLSchema“。同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs:。这个地址应该就是国际标准制定日期/名词
- targetNamespace=”http://www.w3school.com.cn” 显示被此 schema 定义的元素 (note,name, sex, age, describe) (这里讲的是XML文档实际上用的元素和数据类型哦)来自命名空间: “http://www.w3school.com.cn“。
- xmlns=”http://www.w3school.com.cn” 指出默认的命名空间是 “http://www.w3school.com.cn“。
- elementFormDefault=”qualified” 指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。