• 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 = [命名空间名]

无废话XML--XML约束(schema)的更多相关文章

  1. XML的约束(schema)

    XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的局限性 XML Schema符合XML语法结构 DOM.SAX等XML API很容易解析出XML Sc ...

  2. XML(二)之DTD——XML文件约束

    前面介绍了XML的作用和基本的格式,今天我给大家分享的是关于XML的约束.废话不多说,我们直接来正题! 一.DTD简介 1.1.DTD概述 DTD(Document Type Definition,文 ...

  3. XML文件定义约束

    今天在做Android项目的时候,用到了XML解析,服务端返回的不是JSON,而是XML,这时候就需要我们解析XML了,当然在解析XML的时候,需要了XML文件的定义结构,任何一个文件的定义都是要遵循 ...

  4. xml的约束

    一.DTD约束xml 1.约束介绍 由于xml的标签由用户自己定义,因此在开发的时候,每个人都可以根据自己的需求来定义xml标签,这样导致项目中的xml难以维护,因此需要使用一定的规范机制来约束xml ...

  5. [讨论] Window XP 安装msxml6后,load xml时提示schema验证失败

    现象:在windows XP x64下,使用用户安装的msxml6库加载xml文件时失败. 进一步说明: 该xml文档使用了W3C的名称空间 xmlns:xsi= "http://www.w ...

  6. xml文件的schema也是经过jdk编译器编译的,如果xsd没引入完整,而xml中又用到了这些标签,就会编译不通过啊。

    1.xml文件的schema也是经过jdk编译器编译的,如果xsd没引入完整,而xml中又用到了这些标签,就会编译不通过啊. 2.java编译器会下载xsd的指定链接文件,加在代码里,一起编译

  7. 无废话XML--XML细节

    今天开始研究xml,其实在实际的开发中,我们参与到真正的XML开发并不是很多,最多写一个配置,但是我还是觉得很有必要把XML的知识整理一遍.作为基本的2种的数据交互载体(还有一个是json),基本的X ...

  8. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  9. 无废话WCF入门教程六[一个简单的Demo]

    一.前言 前面的几个章节介绍了很多理论基础,如:什么是WCF.WCF中的A.B.C.WCF的传输模式.本文从零开始和大家一起写一个小的WCF应用程序Demo. 大多框架的学习都是从增.删.改.查开始来 ...

随机推荐

  1. 三十分钟学会AWK

    摘要: 本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行了删减或者补充,希望能为对AWK ...

  2. flask-日料网站搭建

    引言:想使用python的flask框架搭建一个日料网站,主要包含web架构,静态页面,后台系统,交互. 本节知识:搭建web目录,目前正在copy网站. python环境:python2.7,fla ...

  3. jqueryui sortable拖拽后保存位置

    jqueryUI sortable 可以用来进行页面拖拽布局,然而有一个小问题就是拖拽后如何保存状态. 工作中遇到了这个情况,遍把这个问题记了下来,具体思路是: 利用拖拽stop后利用   var a ...

  4. mmap函数实现

    转自:https://www.cnblogs.com/huxiao-tee/p/4660352.htmlmmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址 ...

  5. Mybatis中常用的SQL

    1.BaseResultMap <resultMap id="BaseResultMap" type="com.stylefeng.guns.common.pers ...

  6. backbone 要点知识整理

    1.backbone 是个mvc的库,官方文档说它是个库,而不是个框架.库和框架的区别就是,库只是个工具,方便你的项目应用,不会改变你的项目结构,而框架会有一套自己的机制,项目需要遵循框架的设计来实现 ...

  7. 新浪新闻页面抓取(JAVA-Jsoup)

    1.使用gradle建立工程: 工程格式如下: include ':spider-demo' rootProject.name = 'my-spider-demo' settings def void ...

  8. Jfinal启动源码解读

    本文对Jfinal的启动源码做解释说明. PS:Jfinal启动容器可基于Tomcat/Jetty等web容器启动,本文基于Jetty的启动方式做启动源码的解读和分析,tomcat类似. 入口  JF ...

  9. mac上安装mongodb数据库教程

    1.官网下载压缩包,并解压到当地任一目录.(我的是Documents/develop/mongodb) 2.在mongodb下新建data文件夹,在data下新建db文件夹.(bin和data文件夹在 ...

  10. [51nod1232]完美数

    如果一个数能够被组成它的各个非0数字整除,则称它是完美数.例如:1-9都是完美数,10,11,12,101都是完美数,但是13就不是完美数(因为13不能被数字3整除). 现在给定正整数x,y,求x和y ...