在学习一门技术之前,首先要问问自己这几个问题:
1、这个东东是什么 (或者东东是什么)?
2、这个东东能做什么 ?
3、在企业里怎么用这个东东 ?
好了, 问了这三个问题之后, 你就必须做出回答,只有完整的回答了这几个问题,你对这个东东也由浅到深的掌握之中。
首先回答第一个问题:Schema 是什么?
Schema是一种用来限定和描述xml文档的模式语言,他的出现是为了替代DTD的局限性(例如:在DTD中不能很好的指定数据的类型),schema文档其实也是一份xml文档,但是他的扩展名为.xsd, 一份Schema文档被称之为模式文档或者约束文档, 遵循这个文档所编写的文档称之为实例文档。在这里就算是湖大完毕, 不够你可以补充一些,如下:以Schema使用约束xml文档的, Schema文档既然是一份xml文档,那么他就必须要遵循xml的语法,那就必须有一个根节点(根元素),在Schema 中根元素默认并且只能是schema。回答完毕。
回答第二个问题: Schema能做什么用?
这个问题的答案其实已经在第一个问题中出现, 他就是用来约束xml文档的,因为xml是可扩展标记语言,在xml中可以定义自己的标签,他不向html,标签式固定的,在xml可以定义自己的标签,那么每个人定义的标签肯定会不一样,若想大家都能统一的是使用xml,那么就必须要对xml进行约束,这个约束可以xml文档里或单独写在一个文档里,而这个用来约束xml的文档也就称为约束文档,在Schema没有出现以前使用DTD约束,在Schema出现以后使用Schema约束。 回答完毕
回答第三个问题:在企业里怎么使用Schema来约束xml文档呢?
在上面也已经说过了,Schema文档中的跟元素是schema,在编写schema文档时,必须将在标签(或根元素)<schema >中定义的元素绑定到一个URI上,在Schema中有一专业术语叫做名称空间,在解析xml时告诉解析引擎这份xml文档中的元素来自哪里,被谁约束。
编写Schema文档的步骤:
1、在根元素schema中声明一个名称空间,该名称空间要使用指定的官网上定义好了的<schema xmlns="http://www.w3.org/2001/XMLSchema" >, 使用xmlns来声明命名空间的, xmlns是什么?他就是xml namespace的缩写,前面是使用了默认的命名空间,接下类声明一个有具体名字的名称空间,xmlns:csdn="http://www.w3.org/2001/XMLSchema" >,
2、为自己定义元素指定一个名称空间,也就是配置targetNamespace的值,
在这里必须要注意两个问题:
1、这个targetNamespace的值必须要和被约束的xml文档中声明的名称空间的名字相同,以便告诉解析引擎我这份xml文档中的元素都来自这个名字空间,否则这份约束文档将不会起作用
2、若要在Schema中使用自定义限定类型,那么就必须要声明这样的命名空间(如:xmlns:tns="http://www.example.org/limitValue"),并且xmlns:tns的值也必须要和targeNamespace的值相同
疑惑:但是这里为什么要声明一个命名空间为tns呢? 而且他的值也必须要相同呢 ?,否则会报错,错误如下:
3、到目前为止,编写Schema的初步工作已经完成,剩下的就是定义自己所需要使用的元素,至于还有elementFormDefault要不要配置? 经过测试配不配关系不大,但是我们要知道这个是干什么用的,他能起到什么作用,他的作用:将elementFormDefault设置为qualified, 若在xml文档中没有使用默认名称空间,则搜有的元素必须通过加上声明的名称空间为前缀访问元素; 将elementFormDefault设置为unqualified, 则不要加前缀访问元素
例如:book3.xsd 将book3.xsd中elementFormDefault设为qualified, 那么在book3.xml中就必须使用使用前缀来访问,但是若将elementFormDefault设为unqualified, 那么在book3.xml 就不能使用前缀来访问
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="aaaa"
elementFormDefault="qualified">
<xs:element name="books">
<xs:complexType>
<xs:sequence>
<xs:element name="book" >
<xs:complexType>
<xs:sequence>
<xs:element name="author" type="xs:string" />
<xs:element name="bookname" type="xs:string" />
<xs:element name="price" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
book3.xml
<?xml version="1.0" encoding="UTF-8"?>
<itcast:books xmlns:itcast="aaaa" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="aaaa book3.xsd" >
<itcast:book>
<itcast:author></itcast:author>
<itcast:bookname></itcast:bookname>
<itcast:price></itcast:price>
</itcast:book>
</itcast:books>
4、最后在编写完Schema文档之后,你必须在xml文档中引入Schema文档,怎么引入呢? 在根元素中引入Schema的约束
例如:<rootElement xmlns="这里的值必须要与Schema中的targetNamespace的值一样(这里暂且用aaa代替)"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
schemaLocation="aaa book.xsd">
</rootElement>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"代表该xml文件 是一个Schema 文档实例文档
将Schema引入到xml文档中,成功过的约束了xml文档,第三个问题回答完毕.