经历了第一篇XML入门和第二篇DTD的理解,现在终于可以进入到XML Schema的学习了,正如前边提到的,Schema实际上可以说是DTD的一种扩展,一种替代品,或者可以说是DTD的一种优化。
XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。
比较了下DTD和Schema的能力,我感觉其实二者完成的基本功能差别不大,均是为了定义合法的XML模块,可以说Schema是DTD的plus版本吧,更加易懂,易学,扩展性更好。
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文档,DTD定义跟XML没有什么关系,Schema在理解和实际应用有很多的好处。Schema是XML文档,而DTD有自己的特殊语法这样,只需要懂得XML的语法规则就可以编写Schema,无须学习其他的语法规则;
DTD文档的结构是“平铺型”的,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系;Schema文档结构性强,各元素之间的嵌套关系非常直观。
DTD只能指定元素含有文本,不能定义元素文本的具体类型,如字符型、整型、日期型、自定义类型等。Schema在这方面比DTD强大。
Schema支持元素节点顺序的描述,DTD没有提供无序情况的描述(子元素均需按顺序),要定义无序必需穷举排列的所有情况。Schema可以利用xs:all来表示无序的情况。
对命名空间的支持。DTD无法利用XML的命名空间,Schema很好满足命名空间。并且,Schema还提供了include和import两种引用命名空间的方法。
上篇博客已经详细解释过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>
对上边三句解释如下:
继续拿上边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>
其中四句头部声明内容解释如下: