1.文档类型定义DTD(Document Type Definition)是XML结构文件的一种定义方式;
2.DTD定义了可用在文档中的元素,属性,和实体,以及它们之间的相互关系;
3.DTD在建立XML文档中的作用
说说建立一个XML文档的主要步骤:
(1).命名相关的信息项,把其映射为相应的元素或属性.
(2).确定XML文档的层次结构,即各元素之间的嵌套关系
(3).根据层次结构构造DTD;
(4).根据DTD编写相应的XML文档
4.DTD的语法:
<1>.元素定义
(1).元素声明
形式: <!ELEMENT name content >
说明:其中name为XML标记的名字,content 为EMPTY,ANY,描述子元素的顺序和重复次数的内容 模型
(2).元素内容的类型
a). EMPTY 类型 :只有属性没有字符数据或子元素
b). ANY 类型 : 包含DTD定义的所有其他元素或已编译的字符数据
c). #PCDATA 类型:不包含其他子元素而只包含字符数据的元素
d). 子元素类型 :包含一系列的子元素,子元素的内容模型用于指定某个元素可以包含哪些子元素,其结构有两种:序列和选择
e).混合类型 :既包含子元素又包含已编译的字符数据
(3).元素出现次数的指示符
"?" 元素可以出现0次或者1次;
“*” 元素可以不出现,或者出现一次或多次
"+" 元素必须出现至少一次,或者可以说出现一到多次
<2>.属性定义
(1).属性声明
语法: <! ATTLIST Element_name Attribute_name Type Default_value >
说明:ATTLIST 用于定义元素所具有的属性,
Element_name 是元素名;
Attribute_name 是该元素所具有的属性;
Type 是属性的类型
Default_value 是属性的默认值
(2).属性的类型
a). CDATA 类型: 此属性的值只能是文本类型
b). 枚举属性类型: 指定的文本串列表中的某个文本串;
c). ID属性类型: 用于标识文档中的元素;
d). IDREF /IDREFS 类型: 用于引用同一文档中的另一元素的ID属性
e). NMTOKEN/NMTOKENS 属性类型: 必需为一个有效的XML名称;
f). ENTITY 和ENTITYS 属性类型: 用来引用文档中的不可解析的外部实体;
g). NOTATION 类型
用于把属性值和DTD中的<! NOTATION>声明关联起来
(3).属性的默认值
a). REQUIRED : 表示这个元素在使用时必须具有该属性;
b). IMPLIED : 该属性不是必须使用的;
c). FIXED : 在相应的XML文档中可以不用明确的指定该属性的值,如果明确指定属性值,则必须是定义时给出的默认值
xml应用举例:
XML作为一门标记语言,它就需要一种文档(即文档类型定义DTD)来定义,DTD可以看作是一类XML文档的模板。它定义了文档的逻辑结构,规定了XML文档中所使用的元素,实体,元素的属性,元素与实体之间的关系。它使得数据交流与共享得以正常进行,验证了数据的有效性。DTD可以是一个完全独立的文件,也可以在XML文件中直接设定。所以,DTD分为外部DTD(在XML文件中调用另外已经编辑好的DTD)和内部DTD(在XML文件中直接设定DTD)两种。在一些有相互业务往来的公司,如果他们使用的电子文档是XML文档,那么我们就可以定用一个独立的DTD文档。每次交换和定义时都引用它来验证结构完整性和语法的合法性。比如以下一个XML文档:
<?xml version ="1.0" encoding ="GB2312" standalone="yes" ?>
<学生名单>
<学生>
<学号>2003081205</学号>
<姓名>田淋</姓名>
<班级>计03.2班</班级>
</学生>
<学生>
<学号>2003081232</学号>
<姓名>杨雪锋</姓名>
<班级>计03.2班</班级>
</学生>
</学生名单>
它的一个DTD文档如下:
1<?xml version="1.0" encoding="GB2312" standalone="yes"?>
2<!DOCTYPE学生名单[
3<!ELMENT 学号 (#PCDATA)>
4<!ELMENT 姓名 (#PCDATA)>
5<!ELMENT 班级 (#PCDATA)>
6<!ELMENT 学生 (学号,姓名,班级)>
7<!ELMENT 学生名单 (学生,学生)>
8]>
9
10
11
2为DTD定义开始标记,学生名单为其根元素,3到7都是元素定义 ,8是结束标记。下面将介绍一下元素声明的语法及注意事项。
元素声明
格式:<!ELMENT 元素名称 元素的内容格式的定义>
(1)基本元素声明:<!ELMENT 学号 (#PCDATA)> 元素名称后直接跟的是数据类型则为基本元素。
(2)复合元素声明:<!ELMENT 学生 (学号,姓名,班级)> 学生元素是复合元素,它包含学号,姓名,班级三个基本元素。其实根元素是复合元素的一个特例,所有的元素都直接或间接地包含在根元素中。
元素出现次数的控制
加"?"表示些元素可出现0次或1次;加"*"表示可出现任意次;加"+"表示至少要出现一次。如:<!ELMENT 学生 (学号?,姓名,班级,爱好*)>则表示一个学生只有唯一的学号,或者还未分配学号,即学号元素出现0次或1次,而爱好可以没有,也可以有好几方面的,所以用*(任意次)限定。
选择性元素 用"|"限定,如 <!ELMENT 学生(姓名,性别,(优秀|良好|中等))>
属性声明
格式:<!ATTLIST Eltment_name Attribute_name Type [Keyword] [Default_value]>
!ATTLIST 为定义属性的指令,后面是元素的名称,属性名称,属性值类型及默认值的关键字及默认值。
如一个学生有性别及班级两个属性,可这样定义:<!ATTLIST 学生 性别 CDATA "女" 班级 CDATA "计算机03.2班">
必需赋值的属性:加REQUIRED关键字,如:<!ATTLIST 学生 性别 CDATA #REQUIRED "女" 班级 CDATA "计算机03.2班"> 表示必需给出学生的性别值。可有可无的属性则用IMPLIED关键字,固定取值的属性用FIXED关键字。
属性的类型:在XML中共有10种属性类型,如下表:
类型 |
含义 |
CDATA |
字符数据 |
Enumerated |
可能的取值的列表 |
ID |
唯一的数字 |
IDREF |
ID类型属性的值 |
IDREFS |
由空格分开的若干个ID |
ENTITY |
实体 |
ENTITYS |
若干个实体 |
NMTOKEN |
XML名称 |
NOTATION |
DTD中声明的注释名 |
NMTOKENS |
多个XML名称 |
例子:
XML文件代码:
<?xml version="1.0"?>
<!DOCTYPE message[
<!ELEMENT message (header,body,(signature|footer))>
<!ELEMENT header (date,from,to+,subject,banner?)>
<!ELEMENT body (paragraph*)>
<!ELEMENT date (date,month,year)>
<!ELEMENT paragraph (#PCDATA)>
<!ATTLIST paragraph size CDATA #REQUIRED>
<!ELEMENT signature (#PCDATA)>
<!ELEMENT footer ANY>
<!ELEMENT day (#PCDATA)>
<!ELEMENT month (#PCDATA)>
<!ATTLIST month type (numberic|character) #REQUIRED>
<!ELEMENT year (#PCDATA)>
<!ATTLIST year format (numeric|character) "numeric" >
<!ELEMENT from (#PCDATA)>
<!ELEMENT to (#PCDATA)>
<!ATTLIST to relationship CDATA #IMPLIED>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT banner (#PCDATA)>
]>
<message >
<header>
<date>
<day>12</day>
<month type="character">MAY</month>
<year>2006</year>
</date>
<from> luliuyan </from>
<to> luliuyan's wife</to>
<to relationship="very close">Your family</to>
<to relationship="not so close">Your friends</to>
<subject> Merry Christmas</subject>
<banner></banner>
</header>
<body>
<paragraph size="1 line">
Best wishes for Christmas
</paragraph>
<paragraph size="2 line">
I love you!!
</paragraph>
</body>
<footer>
<day>Christmas Day</day>
<from>The best for us</from>
</footer>
</message>
分析:
看XML文件最重要的是要看它的结构:
从上面的示例我们可以知道,第一层次:message包含三个元素:header,body,signature或者footer(其中一个);
第二层次:
header又包含五个子元素:date,from,to("+"表示to元素出现次数为一到多次),subject,banner("?"表示banner元素出现次数为零到多次);
body有子元素paragraph("*"表示paragraph元素可以不出现,或出现一次或多次),而且paragraph有#PCDATA限制,表示不能包含其它元素,且只能是字符数据,另外paragraph含有属性size, 且size属性的类型是CDATA,表示是字符数据,#REQUIRED表示使用paragraph元素时必须使用size属性;
signature元素 也为字符类型;
footer元素类型为任意类型ANY;(本例中是包含其它子元素的类型);
第三层次:
date元素又包含day,month(有type属性),year(有format属性)三个子元素;
from元素;
to元素有relationship属性;