1. 为什么需要DTD约束
2. 什么是DTD约束文档
DTD:Document Type Definition (文档类型定义)
主要功能:约束XML的书写规范
XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。
格式良好的XML(合法的XML):遵循XML语法的XML(满足XML详解中的七要素)
有效的XML(合理的XML):遵循DTD约束文档的XML
合理的XML文档一定是合法的XML文档,但是合法的XML文档不一定是合理的XML文档。
3. 快速入门
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE team [ <!ELEMENT team (person+)> <!ELEMENT person (name,age,email)> <!ELEMENT name %PCDATA;> <!ELEMENT age %PCDATA;> <!ELEMENT email %PCDATA;> ]> <team> <person> <name>吕布</name> <age>36</age> <email>lvbu@163.com</email> </person> <person> <name>貂蝉</name> <age>18</age> <email>xiaodiao@126.com</email> </person> </team>
4. DTD约束文档分类
(1)内部DTD
内部DTD是编写在XML文档中的DTD约束。
基本语法:
<!DOCTYPE 根元素 [ //DTD约束 ]>
编写DTD约束的小技巧:从上往下依次编写
DTD语法
<!ELEMENT 元素名 元素类型>
(2)外部DTD
如果DTD约束文档独立于XML文档,我们把这种文档就称之为外部DTD
基本语法:
<!DOCTYPE 根元素名 SYSTEM "外部DTD的URI">
xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE team SYSTEM "demo06.dtd"> <team> <person> <name>吕布</name> <age>36</age> <email>lvbu@163.com</email> </person> <person> <name>貂蝉</name> <age>18</age> <email>xiaodiao@126.com</email> </person> </team>
demo.dtd:
<!ELEMENT team (person+)> <!ELEMENT person (name,age,email)> <!ELEMENT name #PCDATA;> <!ELEMENT age #PCDATA;> <!ELEMENT email #PCDATA;>
(3)公用DTD
公用DTD主要是由第三方权威机构(W3C)编写,所有文档都必须遵循的一种约束文档
基本语法:
<!DOCTYPE 根元素 PUBLIC "DTD标识名" "公用DTD的URI">
5. DTD约束详解
- 定义元素
- 定义属性
- 定义实体
(1)定义元素
<!ELEMENT 元素名称 元素类型>
主要功能:定义元素出现的名称、顺序、出现的次数...
元素 | 说明 |
(#PCDATA) | 该类型可包含任何字符数据,但是不能包含任何子元素 |
EMPTY | 该类型不能包含子元素和文本,但可以有属性 |
ANY | 该类型可以包含任何在DTD定义的元素内容(常用于根元素) |
(子元素) :定义子元素只能出现一次
(子元素1,子元素2,...) :定义子元素只能出现一次且顺序不能改变
(子元素*) :定义子元素出现的次数为0或多
(子元素+) :定义子元素出现的次数为1或多
(子元素?) :定义子元素出现的次数为0或1
(子元素1|子元素2) :互斥元素
(2)定义属性
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
主要功能:定义元素的属性类型与默认值
属性 | 说明 |
CDATA | 字符或数字(文本类型) |
(en1|en2|...) | 枚举类型(多选一) |
ID 属性唯一 | 要求属性必须是唯一的 |
IDREF 引用 | 引入已定义的ID属性 |
默认值 | 说明 |
#REQUIRED | 必填 |
#IMPLIED | 可选 |
#FIXED | 固定值,有值且值是固定的 |
值 | 默认值,有值且值是可选的 |
例1:CDATA与#REQUIRED
例2:枚举类型与#IMPLIED
例3:ID属性与#REQUIRED
例4:IDREF引用类型(引入已定义的ID类型)
例5:#FIXED与值区别
#FIXED固定值
值 默认值
6. 定义实体
为一段内容起一个别名,然后在文档中可以通过引用别名来实现对这段内容的引用,我们把这种情况就称之为“实体”(功能类似于PHP中的变量)
(1)引用实体
定义语法:
<!ENTITY 实体名称 "实体的值">
引用语法:
&实体名; < > ©
注:只能内部DTD中定义,在XML文档使用
(2)参数实体
定义语法:
<!ENTITY % 实体名称 "实体的值">
引用语法:
%实体名;
注:参数实体必须定义在外部DTD中先定义后使用。
7. 综合实例
产品目录 DTD:
详解综合案例:
(1)阅读第2行代码可知,当前XML文档的根元素为CATELOG。
(2)阅读第4-6行代码可知,当前系统一共定义了3个实体,分别为AUTHOR/COMPANY/EMAIL
(3)阅读第8行代码可知,当前系统根元素下具有多个(1或多)个PRODUCT元素
(4)阅读第10-11行代码可知,当前系统中PRODUCT元素具有4个子元素
(5)阅读12-17行代码可知,当前系统中PRODUCT元素具有多个可选属性
(6)阅读19-22行代码可知,当前系统中SPECIFICATIONS规则内具有两个可选属性
(7)阅读30-35行代码可知,当前系统中PRICE具有4个可选属性
最终结果: