经历了第一篇XML入门和第二篇DTD的理解,现在终于可以进入到XML Schema的学习了,正如前边提到的,Schema实际上可以说是DTD的一种扩展,一种替代品,或者可以说是DTD的一种优化。

Schema基础

Schema用途和能力

用途

XML Schema 的作用是定义 XML 文档的合法构建模块,类似 DTD。

能力

比较了下DTD和Schema的能力,我感觉其实二者完成的基本功能差别不大,均是为了定义合法的XML模块,可以说Schema是DTD的plus版本吧,更加易懂,易学,扩展性更好。

  1. 定义可出现在文档中的元素
  2. 定义可出现在文档中的属性
  3. 定义哪个元素是子元素
  4. 定义子元素的次序 ——————————-DTD不能定义无序情况
  5. 定义子元素的数目
  6. 定义元素是否为空,或者是否可包含文本
  7. 定义元素和属性的数据类型——————-Schema支持更多的数据类型
  8. 定义元素和属性的默认值以及固定值

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>

对上边三句解释如下:

  1. xmlns=”http://www.w3school.com.cn” 规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 “http://www.w3school.com.cn” 这个命名空间。
  2. 一旦拥有了可用的 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>

其中四句头部声明内容解释如下:

  1. xmlns:xs=”http://www.w3.org/2001/XMLSchema”表示 schema 中用到的元素和数据类型(这里讲的是Schema结构的元素和数据类型哦)来自命名空间 “http://www.w3.org/2001/XMLSchema“。同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs:。这个地址应该就是国际标准制定日期/名词
  2. targetNamespace=”http://www.w3school.com.cn” 显示被此 schema 定义的元素 (note,name, sex, age, describe) (这里讲的是XML文档实际上用的元素和数据类型哦)来自命名空间: “http://www.w3school.com.cn“。
  3. xmlns=”http://www.w3school.com.cn” 指出默认的命名空间是 “http://www.w3school.com.cn“。
  4. elementFormDefault=”qualified” 指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定