一、XML约束概述
1、什么是XML约束?
在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为XML约束。
2、为什么要使用XML约束?
我们从网上下载了一个开源框架,这个开源框架是使用XML作为配置文件的,这时候框架的设计者就需要约束我们配置文件的写法。
3、XML约束的作用
约束xml文档的写法
对xml进行校验
4、常见的XML约束技术
XML DTD //文件类型定义(document type definition)
XML Schema //schema:模式,略图
二、如何在xml中引入dtd
(一)外部引入
可以将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd,而文件保存时必须用utf-8编码保存,再在xml文件中使用:
①<!DOCTYPE 根元素名称 SYSTEM 文件的位置>
如果写的是SYSTEM表明当前引入的dtd在当前文件系统中,后面制定的文件位置是当前硬盘中的位置
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> <书> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架> |
文件:book.dtd <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> |
②<!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">
如果写的是PUBLIC表明当前引入的dtd在网络公共位置中,后面要指明dtd的名字和dtd所在网络位置URL地址,如:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
(二)内部引入
直接在xml中书写dtd
<!DOCTYPE 根元素名称[
dtd约束....
]>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> ]> <书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> ... </书架> |
三、dtd语法
(一)元素
<!ELEMENT 元素名称 元素约束>
a、元素约束:
存放类型:ANY/EMPTY (存放任意类型/不能存放任何类型)
b、元素约束:子元素的列表,将可以包含的子元素用小括号括起来
①子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现
<!ELEMENT 书 (书名,作者,售价)>
②子元素之间可以使用竖线进行分割,表示子元素只出现其中之一
<!ELEMENT 书 (书名|作者|售价)>
③#PCDATA 表明包含标签体
<!ELEMENT 书名 (#PCDATA)>
④ + : 一次或多次,如: <!ELEMENT 书架 (书+)>
⑤ ? : 0次或一次,如: <!ELEMENT 书架 (书?)>
⑥ * : 0次或多次,如: <!ELEMENT 书架 (书*)>
⑦也可以使用小括号进行组的操作:
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
(二)属性
(ATTLIST:attribute [ə'trɪbjuːt](属性)list简写)
<!ATTLIST 元素名
属性名1 属性类型 属性约束
属性名2 属性类型 属性约束
.....
>
<?xml version = "1.0" encoding="GB2312" standalone="yes"?> <!DOCTYPE 购物篮 [ <!ELEMENT 肉 EMPTY> <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉" > ]> <购物篮> <肉 品种="鱼肉"/> <肉 品种="牛肉"/> <肉/> </购物篮> |
Ⅰ、属性类型
①CDATA:表示属性的值是一个普通字符串
②ENUMERATED : 属性的值是一个枚举列表中的值。属性的类型可以是一组取值的列表,在 XML 文件中设置的属性值只能是这个列表中的某个值(枚举)。
③ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID 属性的值只能由字母,下划线开始,数字不能打头,不能出现空白字符
<?xml version = "1.0" encoding="gb2312" ?> <!DOCTYPE 联系人列表[ <!ELEMENT 联系人列表 ANY> <!ELEMENT 联系人 (姓名,EMAIL)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> <!ATTLIST 联系人 编号 ID #REQUIRED> ]> <联系人列表> <联系人 编号="a1"> <姓名>张三</姓名> <EMAIL>[email protected]</EMAIL> </联系人> <联系人 编号="a2"> <姓名>李四</姓名> <EMAIL>[email protected]</EMAIL> </联系人> </联系人列表> |
Ⅱ、属性约束
①#REQUIRED --- 表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错。
②#IMPLIED --- (imply 隐含)表明当前属性是一个可选的属性,可以有也可以没有。
③#FIXED '固定值' --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值。如果这样的属性指定了一个不是固定值的值则校验报错。
④'默认值' --- 表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> <!ATTLIST 书 书号 ID #REQUIRED 出版社 CDATA #REQUIRED 种类 CDATA #IMPLIED 网址 CDATA #FIXED "www.taobao.com" 版次 CDATA "第一版"> <!ENTITY press "清华大学出版社"> ]> <书架> <书 出版社="&press;" 种类="计算机软件" 版次="第二版" 书号="a1222"> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> <书 出版社="清华大学出版社" 书号="a1223"> <书名>JavaScript网页开发</书名> <作者>张孝祥</作者> <售价>28.00元</售价> </书> </书架> |
四、ENTITY(实体)
(entity n 实体,本质)
<!ENTITY >就是对一大段内容的引用,可以简化代码的复用。
实体分类:
①引用实体:在xml中引用的实体叫做引用实体
语法格式: <!ENTITY 实体名称 “实体内容” >
引用方式: &实体名称;
②参数实体:在dtd中引用的实体叫做参数实体
<!ENTITY % 实体名称 "实体内容">
%实体名称;
举例1:
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
<!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>
举例2:
<!ENTITY % common.attributes
" id ID #IMPLIED
account CDATA #REQUIRED "
>
...
<!ATTLIST purchaseOrder %common.attributes;>
<!ATTLIST item %common.attributes;>