Schme详解

来源:互联网 发布:生产法工业增加值算法 编辑:程序博客网 时间:2024/05/16 12:57

在学习一门技术之前,首先要问问自己这几个问题:

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文档,第三个问题回答完毕.

原创粉丝点击