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">