• 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. 在ASP.NET Core 2.0中使用CookieAuthentication

    在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...

  2. 2017年 JavaScript 框架回顾 -- 前端框架

    概述: 对于 JavaScript 社区来说,npm 的主要功能之一就是帮助开发者发掘所需的 npm Registry 中的库和框架.npm 强大的搜索功能能够帮助找到一组相关的软件包,同时其内置的的 ...

  3. webp图像批量转换软件推荐——XnConvert

    XnConvert是一款简单易用的批量图像格式转换软件,其所支持图片格式有JPG.PNG.TIFF.GIF.RAW.JPEG2000.WebP.OpenEXR等等.你可以轻松的实现图像格式的转换.缩放 ...

  4. JAVA入门(1.JAVA平台应用 2.核心概念:JVM,JDK,JRE 3.搭建JAVA开发环境 4.学习JAVA的原则)

    主要内容: 1.JAVA平台应用 2.核心概念:JVM,JDK,JRE 3.搭建JAVA开发环境 4.学习JAVA的原则 JAVA的平台应用 JAVA的平台应用分为3个部分: 一.JAVA SE,主要 ...

  5. SDWebImage 加载显示 WebP 与性能问题

    SDWebImage 加载显示 WebP 与性能问题 本文包含自定义下载操作 SDWebImageDownloaderOperation 与编码器 SDWebImageCoder.SDWebImage ...

  6. re 模块 正则表达式

    re模块(正则表达式)   一.什么是正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它 ...

  7. 循序渐进之Spring AOP(4) - Introduction

    前面描述的几种增强(Advice)都是在目标方法范围内织入,而引介(Introduction)不同,直接在类级别上添加目标未实现的接口方法. 在spring中可以通过扩展DelegatingIntro ...

  8. springboot项目启动时提示Address already in use: bind

    PS:web项目在启动的时候,一般会报Address already in use: bind,常规的处理思路为:删除任务管理器中的javaw.exe进程即可:当删除仍然解决不了时,一般处理思路如下, ...

  9. (转)Docker之Compose服务编排

    转自:https://www.cnblogs.com/52fhy/p/5991344.html Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过 ...

  10. 图的存储结构的实现(C/C++实现)

    存档: #include <stdio.h> #include <stdlib.h> #define maxv 10 #define max 10 typedef char e ...