Schema简述:

XML Schema 是用一套预先规定的XML元素和属性创建的,

是一种用于定义和描述XML文档结构与内容的模式语言,

其出现是为了克服DTD的局限性。

 

XML Schema与 DTD区别(面试):

1. XML Schema 符合XML语法结构,本身就是XML文档 。

2. DTD 文档的结构是平铺性,如果定义复杂的XML文档,很难把握元素

之间的嵌套关系,Schema相对文档结构较强 。

解释:DTD 约束定义时,无法看出层次,全是并列定义的,

元素、属性都定义在了同一个标签下,很乱。

Schema 可以看出层次,所以说结构强,直观看到元素间嵌套关系。

3. XML Schema 比 DTD 支持更多的数据类型,并且支持用户自定义 用户类型。 

4. XML Schema 定义约束的能力更加强大 。

5. XML Schema 对命名空间进行支持 。

命名空间:Schema 约束的一个唯一标识(类似Java单继承,防止父类出现同名方法 ,引起不确定性) 

XML文件允许引用多个 Schema 约束,如果多个 Schema 约束中,同时定义了某一个元素,

那XML实例文档在引用的时候,到底引用哪个 Schema 约束的定义?

命名空间就解决了这个问题。


 

初识:

1. Schema本身就是一个XML文档,但是扩展名为.xsd

2. 一个Schema文档通常称之为约束文档,遵循这个约束书写的。

依次约束:

W3C定义好的约束    ---约束--->    books.xsd 约束文档    ---约束--->    books.xml 实例文档

3. 和XML文件一样,一个Schema文档必须有一个根节点, 并且这个根节点的名称必须为schema

4. 编写一个Schema文档后,通常需要把这个文件中声明的元素 绑定到一个URI地址上,

在XML Schema技术中有一个专业术语来 描述这个过程,

即把XML Schema文档声明的元素绑定到一个 名称空间上,

以后XML文件就可以通过这个URI(名称空间)来告诉 解释引擎,XML文档中编写的元素来自哪里,

被谁约束。

 

schema元素:

1 <?xml version="1.0" encoding="UTF-8"?>                                         
2 <schema    xmlns="http://www.w3.org/2001/XMLSchema"    //引用W3C的官方约束
3                  //给这个.xsd文件弄个命名空间,,这个唯一标识必须是唯一的,可以仿照w3c的地址来写。 
4                  targetNamespace="http://www.example.org/books"    
5                  elementFormDefault="qualified"    //格式化
6 >
7 //元素......
8 </schema>

定义元素:

在schema中元素类型分为两种:简单元素和复杂元素。

 

1. 简单元素:不包含子节点或者属性节点,只有文本。

<element name="title" type="string"/>

 

2. 复杂元素:包含子节点或者属性节点。

1 <element name="book" maxOccurs="unbounded">     //可以写入多个book
2     <complexType>    //复杂类型
3         <sequence>     //队列
4             <element name="title" type="string"/> 
5             <element name="price" type="double"/> 
6         </sequence> 
7     </complexType> 
8 </element>

定义属性:

1 <element name="book"> 
 2     <complexType>    //复杂类型
 3         <sequence>     //队列 
 4             <element name="title" type="string"/>
 5             <element name="price" type="double"/>
 6         </sequence> 
 7         //定义属性时必须要写到sequence后边 
 8         <attribute name="id" type="ID" use="required" />   
 9      </complexType>
10 </element>

XML引用Schema:

1 <?xml version="1.0" encoding="UTF-8"?>
 2 <bk:books     xmlns:bk="http://www.example.org/books"    //引用books约束,取别名bk
 3                     //告诉XML ,这是实例。固定格式。
 4                     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
 5                     //本地文件位置
 6                     xsi:schemaLocation="http://www.example.org/books  books.xsd">
 7     <bk:book id="b1">
 8         <bk:title>a</bk:title>
 9         <bk:price>1.1</bk:price>    
10     </bk:book>
11 </bk:books>

别名和命名空间:

在引用schema时,xmlns:e="http://www.example.org/employee,可以添加别名,再次引用标签时,

要在标签前添加别名,不加别名代表的是默认命名空间。

格式化:

定义.xsd时,elementFormDefault="qualified"      //格式化

qualified:根节点有别名,子节点也要有别名。根节点没有别名,字节点也没有别 名。 

unqualified:引用这个约束时,根节点必须有别名,子节点不能有别名。

一个实例XML只有一个默认命名空间。

 

多个Schema:

定义:

1 <element name="employee"> 
 2     <complexType>  
 3         <sequence>   
 4             <element name="name" type="string"/>
 5             <element name="age" type="double"/>
 6             <any></any>     //因为要引入的是另一个约束的元素,这里定义any标签
 7         </sequence> 
 8         <attribute name="id" type="ID" use="required" />   
 9      </complexType>
10 </element>

引用:

1  <e:employee xmlns:e="http://www.example.org/employee"
2         xmlns:c="http://www.example.org/company"
3             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
4             xsi:schemaLocation="http://www.example.org/employee   employee.xsd
5                                 http://www.example.org/company    company.xsd">