现在的语言,如果不有那么一点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. 总结一下使用react-native的一些入门级重要点

    经过多方的协调沟通,我们决定至4.1日起,停止向新用户透出该服务:今年10.15以后,老用户也停止该服务(具体表现是网站上传APK-Android或者URL-iOS入口会下掉,已经发版的App,SDK ...

  2. WebView的基本使用方法

    WebView是View的子类,它主要用来显示网页的. 因为我们要用到网络,所以需要先添加权限:在 Anroidmanifest <manifest ... > <uses-perm ...

  3. 关于H5本部缓存localStorage,sessionStorage

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前,这些都是由 coo ...

  4. iOS进阶_三方使用步骤

    一.配置环境(:后为在终端输入的命令) 打开终端 查看自己电脑的Ruby环境:gem sources -l 如果环境已经是淘宝镜像了,此时不需要再进行环境的修改. 如果不是,发送gem sources ...

  5. 基于VC的ACM音频编程接口压缩Wave音频(二)

    (二)获取CODECs 的 信 息  ACM 的API 函 数 定 义 在 头 文 件msacm.h 中, 除 此 之 外, 对ACM 编 程 还 必 须 包 含 头 文 件mmsystem.h,mm ...

  6. PHPExcel(1.8.0) 帮助代码

    以下代码不能直接运行,只是提供各种方法调用写法. require_once dirname(__FILE__) . '/Classes/PHPExcel.php'; $objPHPExcel = ne ...

  7. OSD磁盘日常监控

    摘要:对ceph OSD磁盘,做好定期的性能数据采集和通电时长管理,长期的数据积累对磁盘的性能与生命周期管理会有一定帮助,同时也能确保整个集群性能的稳定. 磁盘碎片管理 查看磁盘碎片 # xfs_db ...

  8. Java开发视频网站大概需要多少钱?

    这个还真不好说,需要看你对视频网站有什么要求?你的数据库选择的是什么型号的?需要开发几个页面?服务器是需要高端的还是中低端的?还有你对完成时间有什么要求,这些细节也是决定价格的关键因素. 上面这些因素 ...

  9. AMD加载器实现笔记(二)

    AMD加载器实现笔记(一)中,我们实现了一个简易的模块加载器.但到目前为止这个加载器还并不能称为AMD加载器,原因很简单,我们还不支持AMD规范中的config配置.这篇文章中我们来添加对config ...

  10. ACEXML解析XML文件——我是如何学习并在短时间内掌握一个库的使用方法的

    最近做的C++项目中需要使用xml文件保存一些信息,程序启动时会读取这些信息.最终经过主程的评测,决定使用ACEXML库来读取解析XML文件. 好吧,至于为什么选择ACEXML库,我就不说了.既然选择 ...