二、DTD文档定义类型
1、DTD(document type definition 文档类型定义):
1) DTD 是一套关于标记符的语法规则。它是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件组成的一部分。
2) DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,各公司都能够依照DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
3) DTD文件是一个ASCII的文本文件,后缀名为.dtd
该文件一般和xml文件配合使用,主要作用是约束 xml,除了dtd技术外还有一个schema的技术用于去约束xml文件的书写规范。
derived:起源、由来
2、DTD文档的声明及三种引用方法:
1)内部DTD文档(这个用的人很少)
<!DOCTYPE 根元素 [定义内容]>
2)外部DTD文档(经常使用的是外部dtd文档)
<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
3)内部DTD文档结合
<!DOCTYPE 根元素 SYSTEM "DTD文件路径"
定义内容
> (这个几乎就没有人用)
【DTD元素定义语法】
<!EMEMENT 元素名称 类型>
其中类型包括:EMPTY,ANY,#PCDATA
EMPTY:该元素不能包含子元素和文本,但是可以有属性。(空元素)
ANY:该元素可以包含任何在DTD中定义的元素内容
#PCDATA:可以包含任何的字符数据,但是不能再其中包含任何子元素其他类型(组合)
|示例|
<!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 EMPTY> <name>小张</name> 会报错 <name/> 正确
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 ANY>
DTD文件中不同修饰符的含义:

【DTD属性定义语法】
<!ATTLIST 元素名称
属性名称 类型 属性特点
属性名称 类型 属性特点
>
属性的类型包括
1) CDATA:(character data)表示的是普通类型 ,也就是说表示可以放文本(数字和中文);
2) ID: 表示该属性的取值必须是唯一的 备注id类型的属性的值不能以数字开头,一般以英文开头。
3) IDREF/IDREFS:表示属性的值指向文档中其他地方声明的ID类型的值 也就是说当一个元素的属性值,需要去引用另外一个id,则使用IDREF,如果希望引用多个,则使用IDREFS 且属性的值用空格隔开即可;
4) Enumerated:表示的是枚举意思 表示属性的值必须在所列出的指的范围内。
5) ENTITY/ENTITIES :表示的是实体的意思;实体:用于为一段内容创建一个别名,以后再xml文档中,就可以使用别名引用这段内容了。dtd文件中的引用实体是用来给xml文件用的,而参数实体是在dtd文件本身中使用的;
备注:
DTD中如何定义引用实体: <!ENTITY 实体名称 "实体内容"> 直接转变成实体内容引用方式 引用实体是给xml用的
xml中如何调用引用实体:&实体名称
DTD中如何定义参数实体: <!ENTITY % 实体名称 "实体内容"> 参数实体给DTD文件自身用
DTD中如何调用参数实体:%实体名称
属性的特点包括
#REQUIRED :表示必须给属性的赋值
#IMPLIED :(暗示的意思)表示属性的值可有可无
#FIXED "value" :表示属性的值必须是指定的value值
Default "value" : 表示如果不指定,则默认
【实体的定义】

|示例:内部DTD文档使用|
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE poem [
<!ELEMENT poem (author,title,content)><!--poem和(之间必须有空格否则会报错提示:缺少所需的空白区 -->
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
]>
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>
空山不见人,但闻人语声;
反景入深林,复照青苔上。
</content>
</poem>
|示例:外部DTD文档使用| 引用实体一般在写在dtd文件的最后,在xml文件中进行使用 &实体名;
MyClass1.dtd文件内容:
<!ELEMENT 班级 (学生*)> <!--*表示该对象允许出现0次到多次-->
<!ELEMENT 学生 (名字,介绍,年龄)> <!--表示对象必须按照指定的顺序出现-->
<!ATTLIST 学生
地址 CDATA #REQUIRED
学号 ID #REQUIRED
大哥 IDREF #REQUIRED
性别 (男|女) #REQUIRED
>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ENTITY myCopy "我的标志性特征">
MyClass1.xml文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 班级 SYSTEM 'MyClass1.dtd'><!--dtd文件的路径用单引号或者双引号都行 -->
<班级>
<学生 地址="北京" 学号="001" 大哥="002" 性别="男">
<名字>张三</名字>
<介绍>很帅</介绍>
<年龄>27</年龄>
</学生>
<学生 学号="002" 性别="女" 地址="山西" 大哥="002">
<名字>王五</名字>
<介绍>大哥范 &myCopy;</介绍> <!--引用实体的后面必须用;进行分割 -->
<年龄>30</年龄>
</学生>
</班级>
|示例:DTD文档中参数实体的使用| 参数内部实体相当于DTD代码段的声明
MyClass2.dtd文件中的内容
<!ELEMENT 班级 (学生*)>
<!ENTITY % myname "名字">
<!ELEMENT 学生 (名字,介绍,年龄)>
<!ATTLIST 学生
地址 CDATA #FIXED "北京"
学号 ID #REQUIRED
大哥 IDREF #REQUIRED
性别 (男|女) #REQUIRED
>
<!ELEMENT %myname; (#PCDATA)><!--此处正常应该写:名字,但是由于在参数实体中进行了定义,所以此写成%myname也是可以的 -->
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
<!ENTITY mycopy "我的公司版权">
MyClass2.xml文件中的内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 班级 SYSTEM "MyClass2.dtd">
<班级>
<学生 地址="海南" 学号="003" 大哥="001" 性别="男">
<名字>小熊</名字>
<介绍>很嚣张</介绍>
<年龄>23</年龄>
</学生>
<学生 性别="女" 学号="sp001" 大哥="sp002 spoo1" 地址="北京">
<名字>小样</名字>
<介绍>比较熊 &mycopy;</介绍>
<年龄>23</年龄>
</学生>
</班级>

浙公网安备 33010602011771号