• Schema  的由来

DTD 作为 XML 1.0 规范的重要组成部分, 对于 XML 文档的结构起到很好的描述作用。 但是,它也具有一些缺点,比如,它采用了非 XML 的语法规则、不支持数据类型、扩展性较差等等。Schema 正好解决了这些问题。从总体上讲,Schema 具有以下优点:

•  一致性:Schema 使得对 XML 的定义不必再利用一种特定的形式化的语言,而是直接借助 XML 自身的特性,利用 XML 的基本语法规则来定义 XML 文档的结构,使得XML 达到了从内到外的完美统一,也为 XML 的进一步发展奠定了坚实的基础。

•  扩展性:Schema 对 DTD 进行了扩充,引入了数据类型、命名空间,从而使其具备较强的可扩展性。

•  互换性:利用 Schema,我们能够书写 XML 文档以及验证文档的合法性。另外,通过特定的映射机制,还可以将不同的 Schema 进行转换,以实现更高层次的数据交换。

•  规范性:同 DTD 一样,Schema 也提供了一套完整的机制以约束 XML 文档中置标的使用,但相比之下,后者基于 XML,更具有规范性。Schema 利用元素的内容和属性来定义 XML 文档的整体结构,如哪些元素可以出现在文档中、元素间的关系是什么、每个元素有哪些内容和属性、以及元素出现的顺序和次数等等,都可一目了然。

  • Schema  的发展

Schema 是伴随着 XML1.0 规范的制订而推出的,从 Schema 的第一个方案到现在为止,W3C 成员共提交了五个 Schema 规范,分别是 XML-Data、DCD(Document ContentDescription for XML)、SOX(Schema for Object-Oriented XML)、DDML(Document DefinitionMarkup Language)和 XML Schema。直到现在,关于
Schema 还没有一个正式推荐标准,它仍处于不断修改完善的过程当中。

  • 初识 Schema

下面以一个简单的示例对 Schema 进行介绍:

1. <?xml version="1.0" encoding="GB2312" ?>
2. <Schema xmlns="urn:schemas-microsoft-com:xml-data"
xmlns:dt="urn:schemas-microsoft-com:datatypes">
3. <AttributeType name="序号"/>
4. <AttributeType name="性别"/>
5. <ElementType name= "姓名"/>
6. <ElementType name= "年龄"/>
7. <ElementType name= "电话" dt:type="fixed.14.4"/>
8. <ElementType name= "地址" />
9. <ElementType name= "联系人" content="eltOnly">
10. <element type= "姓名" />
11. <element type= "年龄" />
12. <element type= "电话" />
13. <element type= "地址" />
14. </ElementType>
15. <ElementType name= "通讯录" content="eltOnly">
16. <element type= "联系人" />
17. <attribute type="序号"/>
18. <attribute type="性别"/>
19. </ElementType>
20.</Schema>

----第 1 行是 XML 类型声明语句,指明该文档是一个 XML 文档,并且符合版本 1.0 规范;该文档采用 GB2312 编码。

----第 2 行是 Schema 声明语句,它包含了 Schema 命名空间的声明。本例中用到了两个命名空间:一是xmlns="urn:schemas-microsoft-com:xml-data",它指定本文档是一个 XMLSchema 文档;另一个是xmlns:dt="urn:schemas-microsoft-com:datatypes",它定义了在本文档中可以使用的数据类型。

----第 3、4 行是属性定义语句,它定义了两个属性:序号和性别。

----第 5、6、7、8 行是元素定义语句,它定义了四个元素:姓名、年龄、电话、地址。其中为"电话"元素定义了数据类型:fixed.14.4。

----第 9-14 行定义了本 XML Schema 的二级元素:联系人,指明该元素包含四个子元素:姓名、年龄、电话、地址。

----第 15-19 行定义了本 XML Schema 的顶级元素:通讯录,指明该元素包含一个子元素:联系人,以及两个属性:序号、性别。

----第 20 行是结束标记语句,它表明该 XML Schema 的描述到此为止。

  • Schema  语法

Schema 有着自己的一套完整的语法,涉及到的关键元素包括:Schema、ElementType、element、AttributeType、attribute、group、datatype、description。

1,Schema元素是XML Schema中第一个出现的元素, 用于声明该XML文档是一个Schema文档。Schema 具有两个属性:name 指定该 Schema 的名称,而 xmlns 则指定该 Schema包含的命名空间。

2,ElementType 元素是 XML Schema 中重要元素之一,用于定义该 XML Schema 文档中出现的元素。 通过属性 content 来表明 ElementType 所声明的元素是否为空、 是否包含文本、是否包含子元素、还是既包含文本又包含子元素,通过 dt:type 指定该元素的数据类型,通过 order 指定该元素的子元素的排列规则,相应取值有:one、seq、many。element 元素是用于声明在 ElementType 中出现的元素,它需要同ElementType 配合使用。

3,AttributeType 元素用于定义在 Schema 文档中出现的属性类型。其属性 dt:type 指定所声明属性类型的数据类型, 可支持的数据类型包括: entity, entities, enumeration, id, idref,idrefs, nmtoken, nmtokens, notation, 和 string。default 属性可用于指定该属性类型的缺省取值。required 属性指定该属性对于引用它的元素是否是必须的。 attribute 元素实际上是对 AttributeType
声明的属性的引用,它也需要同 AttributeType 配合使用。

4,group 元素是用于将 XML 文档中的元素分组。通过属性 order 可指定该分组中的元素或子分组的顺序, 通过 minOccurs 和 maxOccurs 分别指定该分组在 XML 实例文档中出现的最少和最多次数。

5,datatype 是 XML Schema 中一个重要元素,也是 XML Schema 的一大特色,它用于为ElementType 和 AttributeType 指定数据类型。 XML Schema 支持两种数据类型, 一种是 XML1.0 标准中定义的十种基本数据类型:entity, entities, enumeration, id, idref, idrefs,nmtoken, nmtokens, notation, 和 string; 另外, 还支持一些扩展数据类型, 包括: bin.base64,bin.hex,
boolean, char, date, dateTime, dateTime.tz, fixed.14.4, float, int, number, time,time.tz, i1, i2, i4, r4, r8, ui1, ui2, ui4, uri, uuid。

6,description 只能算是 XML Schema 中一个配角,它的主要作用是为 ElementType 和AttributeType 元素提供描述信息。

  • Schema  的应用

由于 XML Schema 的种种优点,现在 Schema 取代 DTD 已成大势所趋。在这种情况下,国际上一些知名企业和组织审时度势纷纷在战略上向 XML Schema 倾斜,提供对 XMLSchema 的支持。其中最为典型的当然要数微软的 BizTalk 和 xml.org 组织的注册/资源库。更加值得一提的是,微软在其浏览器软件 Internet Explorer
5.0 中率先提供对 Schema 的支持,当然,因为最终的 XML Schema 标准尚未正式推出,因此微软支持的 Schema 也只是过渡性"标准",今后还会不断修改。

我们在使用框架写XML的时候,使用的就是schema。说下我理解最深的一点,为什么框架这里要使用schema,框架要放好多不同的包进来,那么这个是就会有一个命名冲突的问题。为了解决这个问题,那么我们写XML标签的时候就要声明不同的命名空间,比如说这个标签是那个命名空间下的。schema很好的解决了这个问题,而且直接一看就可以直接这份XML中,我们那些可以使用,那些不可以使用,要想只用特定的命名空间的标签那么我们必须要引入特定的schema。

以下是一份具体的SPRINGMVC层的配置文件的schema:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/aop
http://www.directwebremoting.org/schema/spring-dwr
http://directwebremoting.org/schema/spring-dwr-2.0.xsd">
  • 关于上面这个schema说明如下:

1,xmlns: 命名空间缺省定义方式

2,xmlns:xsi:声明XML Schema实例名称空间并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:schemaLocation属性。XML Schema实例名称空间的前缀通常使用xsi。

     如果没有那句话,下边的xsi:schemaLocation这个属性不起作用。

3,xsi:schemaLocation:这个schema文件的地址。



在j2ee中,上面这3个东西都是存在的,所以就不用管了。比如说web.xml里面也有这3句话的:

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

我们要想使用<mvc:annotation-driven />这种指定命名空间的标签,就必须导入上面xmlns:mvc="http://www.springframework.org/schema/mvc" ,意思就是告诉这个XML说:这个XML可以使用这个mvc标签了,然后里面的东西都是定义在mvc这个命名空间下的。此外还要把这个schema的地址引入进来,也就是http://www.springframework.org/schema/mvc ,http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
这2个地址,这样子就可以使用这个mvc标签了。

  • 最后说一下命名空间

命名空间声明有两种方式,即直接定义方式和缺省定义方式:

直接定义方式: xmlns: [命名空间前缀] = [命名空间名]

缺省定义方式: xmlns = [命名空间名]

最新文章

  1. iOS存储的三种方式
  2. MySQL导入sql脚本错误:2006 - MySQL server has gone away
  3. VirtualBox: Effective UID is not root (euid=1000 egid=100 uid=1000 gid=100)
  4. scala言语基础学习十二
  5. laravel查询构造器中别名的问题
  6. sql取字段特定符号的前/后
  7. [排序] 快排 &amp;&amp; 冒泡(自己写)
  8. G-sensor驱动分析
  9. Month Calendar
  10. L1、L2范式及稀疏性约束
  11. HTML5 web开发时遇到的一个奇葩问题。
  12. VS C++工程类成员初始化检测脚本
  13. Xamarin.Android 入门实例(3)之呼叫电话号码
  14. String为值类型还是引用类型
  15. ArcGIS jsAPI (4.x)本地部署字体符号乱码
  16. find命令之(-atime,-ctime,-mtime)
  17. JAVA中重写equals()方法的同时要重写hashcode()方法
  18. 好代码是管出来的——.Net中的代码规范工具及使用
  19. nginx系列5:nginx的请求处理流程
  20. windows 下面安装make

热门文章

  1. Linux 笔记 #02# Installing MySQL &amp; Installing the Default JRE/JDK
  2. 基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新
  3. 在HTML页面中获取当前项目根路径的方法
  4. 51Nod 1182 完美字符串(字符串处理 贪心 Facebook Hacker Cup选拔)
  5. CodeForces832-B. Petya and Exam
  6. 二分查找c++简单模板
  7. Palindromes
  8. Convex(扫描线降维)
  9. Linux 文件操作命令-Linux基础环境命令学习笔记
  10. flume1.8 Interceptors拦截器(五)