1 xml 约束的概念

  • XML 指可扩展标记语言(EXtensible Markup Language)
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性质。

  因为xml文件是可扩展的,且里面的标签可以自定义的,只要符合xml的最基本要求,那么就可以写一个xml文件。但是在实际应用中,我们需要针对某一个特定的应用,给xml中引入一下语法,这些语法用来检测特定应用的xml文件编写是否正确。例如mybatis中使用的DTD约束,spring中使用的shema约束。

  xml约束就是在特定应用下,为xml编写的一下语法,用来检测这个应用下的xml文件是否正确。

2 xml约束常用的两种约束

  (1) DTD约束

  描述约束的文件是以.dtd为扩展名,dtd约束作用于xml文档,会有两种方式

(一)把dtd约束直接写到xml文档中

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE users[
<!ELEMENT users (user+) >
<!ELEMENT user (name,age,addr) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT age (#PCDATA) >
<!ELEMENT addr (#PCDATA) >
]>
<users>
<user>
<name>zhangsan</name>
<age>23</age>
<addr>shanghai</addr>
</user>
<user>
<name>lisi</name>
<age>24</age>
<addr>beijing</addr>
</user>
</users>

(二)在xml文档中引用一个外部的dtd约束文档(dtd约束文档以.dtd作用扩展名),

外部引用又包括两种,

一种是SYSTEM 系统外部约束文档,也就是xml文档和dtd约束文档都在同一台机器上,

一种是PUBLIC公共外部约束文档,也就是xml文档和dtd约束文档不在同一台机器上,需要通过网络把dtd文档下载到本地

引用形式如下

<!DOCTYPE 根元素 SYSTEM "dtd文件路径">
<!DOCTYPE 根元素 PUBLIC "dtd文件的描述信息" "dtd的url">

SYSTEM 系统外部约束文档示例

PUBLIC公共外部约束文档  示例

<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

  DOCTYPE后面的mapper就是整个xml的根标签,  PUBLIC表示引用的dtd约束是一个公共约束

  (2)shema约束

shema约束简介

Schema它也来约束xml文件的,DTD在约束xml的时候一个xml中只能引入一个DTD,同时DTD它无法对属性以及标签中的数据做数据类型的限定。
Schema它是用来代替DTD来约束xml。
Schema文件本身就是使用xml文件书写的,同时它对需要约束的xml中的数据有严格的限定。
学习Schema主要来学习W3C组织定义的如何在Schema中去约束xml的标签以及属性,还有属性的数据类型,以及标签中子标签的顺序。
要定义一个Schema文件,这时它的扩展名必须是.xsd。在这个文件中根元素必须是schema。
使用Schema来约束xml,Schema在书写的时候,只需要使用W3C组织提前定义的限定标签的,以及限定的属性的那个标签即可。

shema约束定义案例

在定义Schema文件的时候,由于这个Schema文件本身就是xml,它也要受到别的约束。而这个约束是W3C组织提前定义好的,
在Schema文件中需要提前引入进来在根标签中使用属性进行进入:
<schema xmlns="http://www.w3.org/2001/XMLSchema" 引入W3C定义的schema书写的约束
targetNamespace="http://www.itcast.org/book" 给当前的Schema文件起名字(命名空间)
作用是当哪个xml要引入这个schema约束的时候,必须通过当前targetNamespace 后面书写的uri地址来引入
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.org/book"
elementFormDefault="qualified">
<element name="books">
<complexType>
<sequence>
<element name="book">
<complexType>
<sequence>
<element name="name"></element>
<element name="author"></element>
<element name="price"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>

在xml文件中引入当前的这个Schema

schema instance(schema 实例),这个概念类似于类实例(对象),http://www.w3.org/2001/XMLSchema 这个定义schema约束文件的元约束文件的命名空间,通过这个元约束的命名空间定义的schema约束文件就是schema实例。也就是说schema实例其实就是schema约束文件,就像类实例就是类对象一样。

<books xmlns="http://www.itcast.org/book"   它是schema文件中的targetNamespace 属性的值
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 说明当前的xml是schema一个实例文档,其真正的含义是xml schema instances 命名空间,也就是所有的shema实例都在这里面,是和下面的 sxi:shemaLocation进行绑定的
xsi:schemaLocation="http://www.itcast.org/book book.xsd" 这个是在引入当前的schema文件的真实路径 >

在每个xml文件中,我们都会看到   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  这个命名空间是实例命名空间,我们在xml中引入的schema实例,都必须和 "http://www.w3.org/2001/XMLSchema-instance" 进行绑定,绑定是通过一个前缀进行绑定。在books.xml中,这个前缀是xsi  。

上图未没有进行绑定,报错信息如下:

The prefix "test" for attribute "test:schemaLocation" associated with an element type "books" is not bound.

books元素的"test:schemaLocation"属性的前缀没有绑定

其实schema实例命名空间的前缀可以修改,例如把前缀修改成test,那么上图就不会报错,示例如下图

 

  描述约束的文件以 .xsd为扩展名,在xml中引入多个shema的约束如下

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
</beans>

  在引入shema约束时,并没有再另外使用新的标签(DTD约束使用<!DOCTYPE>标签引入约束),而是在根标签中使用xmlns属性来引入约束,xmlns是xml namespace的简写。并通过 xsi:schemaLocation="" 把schema约束的位置进行指定,一般情况下会按照指定的位置到网络中下载约束文件,如果没有网络,需要自己指定本地约束文件。

												

最新文章

  1. 转 centos虚拟机环境的构建。
  2. iOS Apple Pay
  3. paip.提高效率---微信 手机app快速开发平台—微网络撬动大市场
  4. MonoRail学习:可重复组件ViewComponents的使用
  5. DEDECMS 关键字不能小于2个字节!
  6. android MessageQueue入门
  7. mybatis一级缓存二级缓存
  8. 【SoftwareTesting】Lab 2
  9. 001_JavaScript学习
  10. ArcGIS AddIn调用ArcMap自带的对话框
  11. javascript 创建video元素
  12. eclipse中svn项目重定向地址
  13. English trip EM2-LP-6B Teacher:Gabriele
  14. leetcode1010
  15. BI 可视化
  16. Python 导出导入安装包
  17. 一个简单的获取RGB值方式
  18. 免费获取半年 Bitdefender Total Security 2014
  19. 关于XUtils框架细解
  20. [转载]Delphi 版 everything、光速搜索代码

热门文章

  1. oracleXE数据库没有公开wm_concat函数, 需要手动添加
  2. 第四章&#160;栈与队列(c1)栈应用:进制转换
  3. TOJ 4976: 新生数(深搜)
  4. nth-child &amp; nth-of-type区别
  5. 微信小程序开发——开发者工具无法输入中文的处理
  6. [剑指Offer]52-两个链表的第一个公共节点
  7. OC 线程操作1 - pthread
  8. C# System.Data.OracleClient requires Oracle client software version 8.1.7 or greater
  9. 开源项目CircleImageView
  10. gulp ( http://markpop.github.io/2014/09/17/Gulp入门教程 )