DTD语法介绍
简单的介绍一下DTD语法。
author: zhangjunhd@gmail.com
Blog: http://blog.csdn.net/zhangjunhd/
1.前言
XML作为一门标记语言,它就需要一种文档(即文档类型定义DTD)来定义,DTD可以看作是一类XML文档的模板。它定义了文档的逻辑结构,规定了 XML文档中所使用的元素,实体,元素的属性,元素与实体之间的关系。它使得数据交流与共享得以正常进行,验证了数据的有效性。DTD可以是一个完全独立的文件,也可以在XML文件中直接设定。所以,DTD分为外部DTD(在XML文件中调用另外已经编辑好的DTD)和内部DTD(在XML文件中直接设定 DTD)两种。
1.1内部DTD
如果DTD被包含在XML源文件中,它将通过以下语法格式来在"DOCTYPE"中定义:
<!DOCTYPE root-element [element-declarations]>
例1:
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
上述包含有DTD的XML文档解释如下
<!DOCTYPE note (在第2行) 定义这是一个类型为note的文档.
<!ELEMENT note (在第3行) 定义 note 有四个元素: "to,from,heading,body".
<!ELEMENT to (在第3行) 定义 to 元素类型为 "#PCDATA".
<!ELEMENT from (在第4行) 定义 from 元素类型为 "#PCDATA".
......
1.2外部DTD
如果DTD在XML源文件的外部,它将通过以下语法格式来在"DOCTYPE"中定义:
<!DOCTYPE root-element SYSTEM "filename">
例2:
此例XML文档与例1相同,但是使用的是外部的DTD
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
文件note.dtd包含定义的DTD
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
2.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]>
-2为DTD定义开始标记,学生名单为其根元素,3到7都是元素定义 ,8是结束标记。下面将介绍一下元素声明的语法及注意事项。
2.1元素声明
格式:<!ELMENT 元素名称 元素的内容格式的定义>
(1)基本元素声明:<!ELMENT 学号 (#PCDATA)> 元素名称后直接跟的是数据类型则为基本元素。
(2)复合元素声明:<!ELMENT 学生 (学号,姓名,班级)> 学生元素是复合元素,它包含学号,姓名,班级三个基本元素。其实根元素是复合元素的一个特例,所有的元素都直接或间接地包含在根元素中。
2.2元素出现次数的控制(见表1)
| 表 1 | |
| 符号 | 代表标记出现的次数 |
| ? | 不出现或只出现一次 |
| * | 不出现或可出现多次 |
| + | 必须出现一次以上 |
| 无符号 | 只能出现一次 |
如:<!ELMENT 学生 (学号?,姓名,班级,爱好*)>则表示一个学生只有唯一的学号,或者还未分配学号,即学号元素出现0次或1次,而爱好可以没有,也可以有好几方面的,所以用*(任意次)限定。
2.3选择性元素
用"|"限定,如 <!ELMENT 学生(姓名,性别,(优秀|良好|中等))>
2.4空元素
空元素是通过关键字EMPTY来声明的。
语法格式为:
<!ELEMENT element-name EMPTY>
例:
<!ELEMENT br EMPTY>
在XML文档中使用为
<br />
2.5含有任意内容的元素
含有任意内容的元素是通过关键字ANY来声明的。所谓任意内容是指能够包含任何结合的可被解析的数据。
语法格式为:
<!ELEMENT element-name ANY>
例:
<!ELEMENT note ANY>
2.6属性声明
格式:<!ATTLIST Eltment_name Attribute_name Type [Keyword] [Default_value]>
!ATTLIST 为定义属性的指令,后面是元素的名称,属性名称,属性值类型及默认值的关键字及默认值。
如一个学生有性别及班级两个属性,可这样定义:<!ATTLIST 学生 性别 CDATA "女" 班级 CDATA "计算机03.2班">
2.7属性内定值(见表2)
| 表2 | |
| 属性内定值 | 描述 |
| #REQUIRED | 表示在标记中必须出现此属性。 |
| #IMPLIED | 标记中可以不出现此属性。 |
| #FIXED | 属性的值是固定的某个值。 |
| 字符串 | 标记中如没有指定属性的值,那么此字符串就是此属性的值。 |
必需赋值的属性:加REQUIRED关键字,如:<!ATTLIST 学生 性别 CDATA #REQUIRED "女" 班级 CDATA "计算机03.2班"> 表示必需给出学生的性别值。可有可无的属性则用IMPLIED关键字,固定取值的属性用FIXED关键字。
2.8属性的类型:在XML中共有10种属性类型,(见表3)
| 表 3 | |
| 属性值类别 | 描述 |
| CDATA | 属性值仅仅是一般的文字。 |
| Enumerated | 列出该属性的取值范围,一次只能有一个属性值能够赋予属性。 |
| NMTOKEN | 表示属性值只能由字母、数字、下划线、. 、:、-这些符号组成。 |
| NMTOKENS | 表示属性值能够由多个nmtoken组成,每个nmtoken之间用空格隔开。 |
| ID | 该属性在xml文件中是唯一的,常用来表示人的身份证号码。 |
| IDREF | 表示该属性值是参考了另一个id属性。 |
| IDREFS | 表示该属性值是参考了多个id属性,这些id属性的值用空格隔开。 |
| ENTITY | 表示该属性的设定值是一个外部的entity,如一个图片文件。 |
| ENTITYS | 该属性值包含了多个外部entity,不同的entity之间用空格隔开。 |
| NOTATION | 属性值是在dtd中声明过的notation(声明用什么应用软件解读某些二进制文件,如图片)。 |