XML学习笔记3——XSD简述
现在的语言,如果不有那么一点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简述的更多相关文章
- XML学习笔记7——XSD实例
在前面的XSD笔记中,基本上是以数据类型为主线来写的,而在我的实际开发过程中,是先设计好了XML的结构(元素.属性),并写好了一份示例,然后再反过来写XSD文件(在工具生成的基础上修改),也就是说,是 ...
- XML学习笔记5——XSD复杂数据类型
和简单数据类型对应就是复杂数据类型了,XML元素的数据类型可以是简单数据类型,也可以是复杂数据类型,而XML属性的数据类型就只能是简单数据类型.这篇笔记,就来学习一下XSD中的复杂数据类型了. 1.定 ...
- XML学习笔记4——XSD简单数据类型
XSD提供了数据类型,并且支持自定义数据类型,但这一切都是建立在XSD内置数据类型和一套扩展内置数据类型的规则基础之上的,在这一篇笔记中,就来看看XSD中的数据类型. 1.XSD数据类型图 先看一下数 ...
- XML学习笔记
XML学习笔记 第一部分:XML简介 我们经常可以听到XML.HTML.XHTML这些语言,后两者比较清楚,一直不是很明白XML是什么,这里做一个总结. XML(eXtensible Markup L ...
- delphi操作xml学习笔记 之一 入门必读
Delphi 对XML的支持---TXMLDocument类 Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...
- XML学习笔记(三) -- Schema
标签(空格分隔): 学习笔记 Schema的格式 XML Schema文档是由元素.属性.命名空间和XML文档中的其他节点构成的. XML Schema有两种重要的Schema模型:Microsoft ...
- day0203 XML 学习笔记
day02, 03 1. xml语言和作用 2. xml语法详解 2.1 xml 语法声明 2.1.1 encoding 属性 2.1.2 standalone 属性 2.2 xml 元素(Eleme ...
- XML学习笔记(四)-- 修饰XML文档的CSS
标签(空格分隔): 学习笔记 XML为存储结构化数据提供了强大的方法,但是它没有提供关于数据如何显示地信息,(数据的结构与数据表示无关).可以使用CSS来控制XML文档中各元素的呈现方式. CSS语法 ...
- XML学习笔记(二)-- DTD格式规范
标签(空格分隔): 学习笔记 XML的一个主要目的是允许应用程序之间自由交换结构化的数据,因此要求XML文档具有一致的结构.业务逻辑和规则.可以定义一种模式来定义XML文档的结构,并借此验证XML文档 ...
随机推荐
- 用Python写爬虫爬取58同城二手交易数据
爬了14W数据,存入Mongodb,用Charts库展示统计结果,这里展示一个示意 模块1 获取分类url列表 from bs4 import BeautifulSoup import request ...
- MySQL的limit查询优化
MySQL的limit查询优化以下的文章主要是对MySQL limit查询优化的具体内容的介绍,我们大家都知道MySQL数据库的优化是相当重要的.其他最为常用也是最为需要优化的就是limit.MySQ ...
- 前端学习之回调函数、call方法、apply方法
今天学习的内容比较少,大部分时间是自己在写qq音乐和京东移动端的页面.现在说说今天学到的内容: 首先,回调函数,就是在函数内部中调用另外一个函数, 将一个函数当作参数传给另一个函数,被传的函数叫做回调 ...
- toad的基本操作
1.把鼠标停在sql所在行,然后ctrl+Enter直接执行当前sql. 2.解决Toad对中文显示乱码问题(如果数据库所在主机的NLS_LANG是AMERICAN_AMERICA.WE8ISO885 ...
- hdu 5104 素数打表水题
http://acm.hdu.edu.cn/showproblem.php?pid=5104 找元组数量,满足p1<=p2<=p3且p1+p2+p3=n且都是素数 不用素数打表都能过,数据 ...
- android wifi Direct Audio TX/RX延迟分析
1 Direct Audio TX代码流程 1.1 从Host到FW 1.1.1 代码流程 htc.c::HifLayerRecvCallback//从HIF_USB_CONTEXT获取数据中断,具体 ...
- JAVA 求和程序
- python if
根据用户从控制如输入数据,使用if语句实现用户登录功能 代码如下: name = "zy"password = "123"_name = input(" ...
- .NET转Java学习规则
做一个个人Blog(博客) 过程分3个大阶段: 使用servlet/jsp和jdbc,mysql完成第一阶段Blog 项目修改为Spring(IOC+MVC)+SpringJdbc+MyBatis模式 ...
- 【重磅推荐】腾讯Bugly2015年移动应用质量大数据报告
2015年,随着移动智能设备的普及,移动端用户的增速明显放缓:相比之下,由于云服务.众筹平台.推广平台等基础设施和服务的不断改善,极大降低了创业的门槛,越来越多人投身于移动应用的创新创业中. 想让用户 ...