文件约束
文件约束就是xml文档的书写规范,它约定了该文档的元素和属性应该怎么写,应该怎么嵌套
而DTD是文件约束的一种方式。常用的就如下两种,本文介绍DTD
- XML DTD
- XML Schema
DTD
DTD(document type definition 文档类型定义)常与xml文件配合,约束文件。
例如这样的myClass.dtd
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
第一行表示根元素为班级,可以有一个或者多个子元素学生,+是正则表达式
第二行表示学生元素有三个子元素名字,年龄,介绍
#PCDATA表示名字里面可以放任意文本
那么xml文件会这样写
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE 班级 SYSTEM "myClass.dtd">
<班级>
<学生>
<名字>周小星</名字>
<年龄>23</年龄>
<介绍>学习刻苦</介绍>
</学生>
<学生>
<名字>林晓</名字>
<年龄>25</年龄>
<介绍>是一个好学生</介绍>
</学生>
</班级>
基本语法
元素语法
<!ELEMENT NAME CONTENT>
例如dtd文件这样写,表示家庭可以有一个到多个人和0到多个家电
<!ELEMENT 家庭(人+,家电*)>
xml文件这样写
<家庭>
<人 名字="张晓明" 性别="男" 年龄="25"/>
<人 名字="李小钢" 性别="男" 年龄="36" 爱好="作个教育家和伟人"/>
<家电 名称="彩电" 数量="3"/>
</家庭>
元素类型
-
ELEMENT是关键字,是不能修改的
-
NAME表示元素名称
-
CONTENT是元素类型,必须要大写!CONTENT的内容有三种写法:
EMPTY——表示该元素不能包含子元素和文本,但可以有属性。
ANY——表示该元素可以包含任何在该DTD中定义的元素内容
#PCDATA——可以包含任何字符数据,但是不能在其中包含任何子元素元素的组合类型
符号 | 用途 | 示例 |
---|---|---|
() | 用来给元素分组 | (古龙|金庸),(王朔|余杰) |
| | 在列出的对象中选择一个 | (男人|女人) |
+ | 该对象必须出现一次或者多次 | (成员+) |
* | 该对象允许出现0次或者多次 | (爱好*) |
? | 该对象必须出现0次或者1次 | (菜鸟?) |
, | 对象必须按指定的顺序出现 | (西瓜,苹果,香蕉) |
属性语法
<!ATTLIST 元素名称
属性名称 类型 属性特点
属性名称 类型 属性特点......
>
我们想在学生这个子元素上加上地址这个属性
<!ATTLIST 学生
地址 CDATA #REQUIRED
>
属性特点
- #REQUIRED,表示这个属性必须给,不给就报错
- #IMPLIED,表示这个属性可以给也可以不给
- #FIXED value,表示这个属性必须给一个固定的value值
- Default value,表示这个属性如果没有值,就分配一个默认的value值
属性类型
- CDATA 属性值可以是任何字符(包括中文和数字)
- ID 该属性的取值必须是唯一的,但是属性的值不能是以数字开头!
- IDREF/IDREFS
- IDREF属性的值指向文档中其它地方声明的ID类型的值
- IDREFS,具有由空格分开的多个引用。
<家庭>
<人 relID="P_1" name="爸爸"/>
<人 relID="P_2" name="妈妈"/>
<人 relID="P_3" parentID="P_1 P_2" name="儿子"/>
</家庭>
- Enumerated 事先定义好一些值,属性的值必须在所列出的值的范围内
<!ATTLIST person
婚姻状态 (single|married|divorced|widowed) #IMPLIED
>
DTD实体ENTITY/ENTITIES
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了
- 在DTD定义中,一条!ENTITY语句用于定义一个实体。
- 实体可分为两种类型:引用实体和参数实体。引用实体是被XML文档应用的,而参数实体是被DTD文件本身应用的。
引用实体
<!ENTITY 实体名称 "实体内容">
引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容
<!ENTITY copyright "I am a programmer">
....
©right;
参数实体
<!ENTITY % 实体名称 "实体内容">
引用方式为:%实体名称
<!ENTITY % TAG_NAME "姓名|EMAIL|电话|地址">
<!ELEMENT 个人信息 (%TAG_NAME;|生日)>
<!ELEMENT 客户信息 (%TAG_NAME;|公司名)>
其实就是定义一个变量来提取哪些重复冗余的数据
DTD文档的声明及引用
内部DTD文档
<!DOCTYPE 根元素 [定义内容]>
<!DOCTYPE scores[
<!ELEMENT scores (student+)>
<!ELEMENT student (name,course,score)>
<!ATTLIST student id CDATA #REQUIRED>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>
<scores>
<student id="1">
<name>www</name>
<course>java</course>
<score>66</score>
</student>
</scores>
外部DTD文档
- 引用本地文件,用SYSTEM标识,并写上”DTD的文件路径”,如下:
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
- 如果引用的DTD文件是一个公共的文件时,采用PUBLIC标识,如下方式:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">
本文参考于# XML——XML文件约束之DTD详解