现在的语言,如果不有那么一点OO的影子,都不好意思称之为语言了。在XML的语义约束方面,DTD虽然简单,但是功能不够强大,完全是直白的描述,于是又有了替代DTD的XSD(XML Schema Definition),XSD引入了数据类型,提供了自定义数据类型的各种机制,甚至还能找到继承、多态等各种OO特征,然而学习起来也就相对复杂了,从这篇笔记开始学习一下XSD。

1、XSD文件是一种XML文件

  XSD文件是一种XML文件,满足所有XML文件格式的一切要求,比如有且仅有一个根元素(这个根元素就是<schema/>),所有对XML文件有效的技术对XSD文件也同样有效,包括使用XSD文件作为语义约束。

2、XSD文件的根元素

  XSD文件的根元素是<schema/>,它还可以有自己的属性,我们先看看spring-beans-3.2.xsd这个例子:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!--xsd文件本身是xml文件,第一行是xml声明-->
<xsd:schema xmlns="http://www.springframework.org/schema/beans" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.springframework.org/schema/beans">
<!--
xsd作为xml文件,其根元素是schema
属性xmlns:xsd="http://www.w3.org/2001/XMLSchema"是引入文档约束的,表示在当前文档导入"http://www.w3.org/2001/XMLSchema"中所描述的规则,并且使用里面的元素要添加xsd的前缀(和xmlns:xsd相对应,也可以指定其它前缀)
属性targetNamespace="http://www.springframework.org/schema/beans"表示当前文档定义的规则处于命名空间"http://www.springfarmework.org/schema/beans"下面,xml文档如需要导入当前文档的规则,就可以指定这个命名空间
属性xmlns="http://www.springframework.org/schema/beans"表示在当前文档中导入"http://www.springframework.org/schema/beans"命名空间下所描述的规则(即当前文档本身描述的规则),并且无需使用前缀,也即默认命名空间,这样,在当前文档就可以直接引用所定义的元素了
-->
</xsd:schema>

我不知道第一次看见这个解释的人有没有迷糊,反正我第一次从w3c的教材上看到的时候是迷糊了,不过没关系,我们的目的主要是应用,以后写xsd文件的时候仿照spring就可以了。

  根元素schema的属性列表如下(先混个眼熟):

属性 说明 取值
id 标识该元素的唯一ID  
attributeFormDefault 指定XML文档使用schema中定义的局部属性时是否必须使用命名空间限定

qualified:必须通过命名空间前缀限定

unqualified:(默认值)无须通过命名空间前缀限定

elementFormDefault 指定XML文档使用schema中定义的局部元素时是否必须使用命名空间限定 取值和含义同attributeFormDefault
blockDefault

设定schema中element和complexType上的block属性的默认值

block属性用来阻止以指定的派生类型代替原类型

#all或者extension、restriction和substitution的自由组合

例如extension表示防止通过扩展派生的复杂类型替代该复杂类型

finalDefault

设定schema中element、simpleType和complexType上的final的默认值

final属性用来阻止以指定的派生类型来派生新类型

对于element和complexType:值可以是#all或extension和restriction的自由组合

对于simpleType:值可以是#all或restriction、list和union的自由组合

targetNamespace 设定schema的命名空间的URI引用  
version 设定schema的版本  
xmlns 设定schema使用的一个或多个命名空间的URI引用  
any attributes 设定带有non-schema命名空间的任何其他属性  

3、在xml文档中使用xsd文件

  根据被引用的xsd文件是否定义了targetNamespace属性,可以分两种情况导入相应的xsd文件:

(1)引入无命名空间的XSD

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="无命名空间XSD文件的URI">
<!--
1.第一步,添加xmlns:xsi属性,引入xsi命名空间
2.第二步,通过xsi命名空间下的属性noNamespaceSchemaLocation指定XSD文件的URI
-->
</root>

(2)引入有命名空间的XSD

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="前缀ns1对应命名空间" xmlns:ns2="前缀ns2对应命名空间" xsi:schemaLocation="ns1前缀对应命名空间 前缀ns1对应命名空间XSD文件的URI ns2前缀对应命名空间 前缀ns2对应命名空间XSD文件的URI">
<!--
1.第一步,添加xmlns:xsi属性,引入xsi命名空间
2.第二步,添加命名空间,可添加多个,但没有前缀的命名空间最多只能有1个
3.第三步,通过xsi命名空间下的属性schemaLocation指定每个命名空间XSD文件的URI,命名空间和相应URI一一对应,多个命名空间用空格分隔
-->
</root>

这里提醒一下:XSD文件引入的是w3的XMLSchema,而一般的XML文档引入的是XMLSchema-instance。

4、XSD文件的注释

  作为XML文件,XSD文件自然也可以使用<!-- -->的注释格式,除此之外,XSD文件中还可以使用XML元素的方式来注释,这就是<annotation>元素,<annotation>元素则是通过使用<document>和<appinfo>两个子元素来起作用的,其中<document>主要放适合人类阅读的注释,而<appinfo>则主要放置针对其它应用程序的注释信息。Spring的XSD文件中有大量的使用

<annotation>
<document><![CDATA[
说明文字
]]></document>
</annotation>

格式的注释,这里就不举例了。

5、在XSD文件中导入其它的XSD文件

在XSD文件中,如果你觉得有必要,还可以导入其它的XSD文件,这有点OO中模块化的意思,将相关的定义封装在一个XSD文件里,然后通过导入在其它XSD文件中使用。导入的方式有三种,列个表比较一下:

导入方式 前提条件 属性
include 被导入XSD文件要么没有命名空间,要么命名空间和当前文件相同,导入后相当于在同一个文件中定义 id:指定<include>元素本身的唯一标识;schemaLocation:指定被导入XSD文件的URI
redefine 前提和include相同,不同的是redefine可以接受<simpleType>或<complexType>从而重定义被导入XSD中内容 同include元素的属性相同
import 被导入XSD文件要么没有命名空间,要么命名空间和当前文件不同,因此import导入的XSD文件会保留原来的命名空间 除id和schemaLocation外,还有一个namespace属性用于指定被导入XSD文件的命名空间

说明一下,类似于C语言中的#include,导入XSD文件的元素只能作为根元素<schema>的子元素,并且位于除了注释元素<annotation>外所有元素的前面,至于三种导入方式的顺序则没有要求。

6、XSD元素

在XSD中,最强大的在于提供了数据类型的支持,并且可以自定义数据类型,在这篇笔记中我并不想就此进入XSD数据类型的泥潭,依旧先在外面转悠转悠,对XSD文件中的元素混个眼熟,这些元素相当于编程语言中的关键字,XSD就是用这些元素定义XML结构的,也可以直接访问W3C在线教程的相关部分:XML Schema参考手册

元素 解释
all 规定子元素能够以任意顺序出现,每个子元素可出现零次或一次。
annotation annotation 元素是一个顶层元素,规定 schema 的注释。
any 使创作者可以通过未被 schema 规定的元素来扩展 XML 文档。
anyAttribute 使创作者可以通过未被 schema 规定的属性来扩展 XML 文档。
appInfo 规定 annotation 元素中应用程序要使用的信息。
attribute 定义一个属性。
attributeGroup 定义在复杂类型定义中使用的属性组。
choice 仅允许在 <choice> 声明中包含一个元素出现在包含元素中。
complexContent 定义对复杂类型(包含混合内容或仅包含元素)的扩展或限制。
complexType 定义复杂类型。
documentation 定义 schema 中的文本注释。
element 定义元素。
extension 扩展已有的 simpleType 或 complexType 元素。
field 规定 XPath 表达式,该表达式规定用于定义标识约束的值。
group 定义在复杂类型定义中使用的元素组。
import 向一个文档添加带有不同目标命名空间的多个 schema。
include 向一个文档添加带有相同目标命名空间的多个 schema。
key 指定属性或元素值(或一组值)必须是指定范围内的键。
keyref 规定属性或元素值(或一组值)对应指定的 key 或 unique 元素的值。
list 把简单类型定义为指定数据类型的值的一个列表。
notation 描述 XML 文档中非 XML 数据的格式。
redefine 重新定义从外部架构文件中获取的简单和复杂类型、组和属性组。
restriction 定义对 simpleType、simpleContent 或 complexContent 的约束。
schema 定义 schema 的根元素。
selector 指定 XPath 表达式,该表达式为标识约束选择一组元素。
sequence 要求子元素必须按顺序出现。每个子元素可出现 0 到任意次数。
simpleContent 包含对 complexType 元素的扩展或限制且不包含任何元素。
simpleType 定义一个简单类型,规定约束以及关于属性或仅含文本的元素的值的信息。
union 定义多个 simpleType 定义的集合。
unique 指定属性或元素值(或者属性或元素值的组合)在指定范围内必须是唯一的。

XML学习笔记3——XSD简述的更多相关文章

  1. XML学习笔记7——XSD实例

    在前面的XSD笔记中,基本上是以数据类型为主线来写的,而在我的实际开发过程中,是先设计好了XML的结构(元素.属性),并写好了一份示例,然后再反过来写XSD文件(在工具生成的基础上修改),也就是说,是 ...

  2. XML学习笔记5——XSD复杂数据类型

    和简单数据类型对应就是复杂数据类型了,XML元素的数据类型可以是简单数据类型,也可以是复杂数据类型,而XML属性的数据类型就只能是简单数据类型.这篇笔记,就来学习一下XSD中的复杂数据类型了. 1.定 ...

  3. XML学习笔记4——XSD简单数据类型

    XSD提供了数据类型,并且支持自定义数据类型,但这一切都是建立在XSD内置数据类型和一套扩展内置数据类型的规则基础之上的,在这一篇笔记中,就来看看XSD中的数据类型. 1.XSD数据类型图 先看一下数 ...

  4. XML学习笔记

    XML学习笔记 第一部分:XML简介 我们经常可以听到XML.HTML.XHTML这些语言,后两者比较清楚,一直不是很明白XML是什么,这里做一个总结. XML(eXtensible Markup L ...

  5. delphi操作xml学习笔记 之一 入门必读

    Delphi 对XML的支持---TXMLDocument类       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...

  6. XML学习笔记(三) -- Schema

    标签(空格分隔): 学习笔记 Schema的格式 XML Schema文档是由元素.属性.命名空间和XML文档中的其他节点构成的. XML Schema有两种重要的Schema模型:Microsoft ...

  7. day0203 XML 学习笔记

    day02, 03 1. xml语言和作用 2. xml语法详解 2.1 xml 语法声明 2.1.1 encoding 属性 2.1.2 standalone 属性 2.2 xml 元素(Eleme ...

  8. XML学习笔记(四)-- 修饰XML文档的CSS

    标签(空格分隔): 学习笔记 XML为存储结构化数据提供了强大的方法,但是它没有提供关于数据如何显示地信息,(数据的结构与数据表示无关).可以使用CSS来控制XML文档中各元素的呈现方式. CSS语法 ...

  9. XML学习笔记(二)-- DTD格式规范

    标签(空格分隔): 学习笔记 XML的一个主要目的是允许应用程序之间自由交换结构化的数据,因此要求XML文档具有一致的结构.业务逻辑和规则.可以定义一种模式来定义XML文档的结构,并借此验证XML文档 ...

随机推荐

  1. JQuery按回车提交数据

    引入JQuery文件 <script src="JS/jquery-1.9.1.js" type="text/javascript"></sc ...

  2. 『TCP/IP详解——卷一:协议』读书笔记——18

    2013-08-27 15:44:52 第7章 Ping程序 7.1 引言 “ping”这个名字来源于声纳定为操作.Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达.该程序发送 ...

  3. javascript练习-私有状态

    在经典的面向对象编程中,经常需要将对象的某个状态封装或隐藏在对象内,只有通过对象的方法才能访问这些状态,对外只暴露一些重要的状态可以直接编写.这是就需要私有状态. function Range(fro ...

  4. 数据库、数据表的创建SP2

      本人前一个版本的数据库.数据表的创建由于不是很详细,于是通过细心的修订,已经修复了很多Bug,希望这篇文章能够给大家一些帮助 --代表注释,相当于C#里的// --切换到master数据库,目的是 ...

  5. Android中,图片分辨率适配总结规则drawable drawable-mdpi drawable-hdpi drawable-nodpi drawable-ldpi

    一直关于android多分辨率适配有些疑惑,从网上找到一些资料并通过测试验证,参考链接:http://blog.csdn.net/lamp_zy/article/details/7686477 现记录 ...

  6. JAVA学习博客---2015-7

    @Updata 2015.7.17  开始熟悉API.WPS首字母自动大写,有的没有加#编号的,其实方法首字母不是大写例如Char charAt 实际上是char charAt.当然骆驼写法charA ...

  7. dlmalloc(Android bionic C库的malloc实现)简介

    欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=56 Dlmalloc是目前一个十分流行的内存分配器,其由Doug Lea从1987年开始 ...

  8. tomcat 运行程序很慢 运行一段时间就报错: java.lang.OutOfMemoryError: PermGen space

    java.lang.OutOfMemoryError: PermGen space 全称是Permanent Generation space,是指内存的永久保存区域. 由于这块内存主要是被JVM存放 ...

  9. 读《我是IT小小鸟》后有感

    我是一名大一新生,在下半学期开学时,我迎来新课程——<大学生职业生涯规划与就业指导 >.这是一门既新颖,又有许多就业知识和理论的学科.在课上,老师向我们推荐了一本书,名叫<我是IT小 ...

  10. __defineGetter__ && __defineSetter__

    看别人源码碰到的,做个备忘. //针对对象增加get\set方法,返回绑定函数的返回值 Date.prototype.__defineGetter__('getYear', function() {r ...