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约束的位置进行指定,一般情况下会按照指定的位置到网络中下载约束文件,如果没有网络,需要自己指定本地约束文件。