DTD:文档类型定义
DTD实际上可以看作一个或多个XML文件的模板,这些XML文件中的元素、元素的属性、元素的排列方式/顺序、元素能够包含的内容等,都必须符合DTD中的定义。
DTD的分类:
DTD可以是一个完全独立的文件,也可以在XML文件中直接设定。所以,DTD分为外部DTD(在XML文件中调用另外已经编辑好的DTD)和内部DTD(在XML文件中直接设定DTD)两种。
比如,有几十家相互联系的、合作伙伴关系的公司、厂商,他们相互之间的交换电子文档都是用XML文档。那么我们可以将这些XML文档的DTD放在某个地方,让所有交换的XML文档都使用此DTD,这是最方便的做法,同时也适用于公司内部的XML文件使用。
内部DTD:
内部DTD是在XML文件的文件序言区域中定义的。语法:
〈!DOCTYPE element-name[........
]〉
!DOCTYPE :表示开始设定DTD,注意DOCUTYPE是大写。
〈Element-name :指定此DTD的根元素的名称,一个XML文件只能有一个根元素。注意,如果 XML文件使用了DTD,那么文件中的根元素就在这里指定 [.........]〉 :在[ ]标记里面定义XML文件使用元素,然后用〉结束DTD的定义。
下面,我们来看一下怎样给XML文件定义DTD,请见例1
例1:
==============================================================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 学生们[
<!ELEMENT 学生们 (学生*)>
<!ELEMENT 学生 (姓名+,年龄?,性别,爱好*)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 性别 (#PCDATA)>
<!ELEMENT 爱好 (#PCDATA)>
<!ATTLIST 学生 身份证号码 ID #REQUIRED>
<!ATTLIST 学生 可选 CDATA #IMPLIED>
<!ATTLIST 学生 婚否 (未婚|已婚) "已婚">
<!ATTLIST 学生 是否好学生 CDATA "是">
<!ENTITY a "尹当">
]>
<学生们>
<学生 婚否="未婚" 身份证号码="s4303211396786" 是否好学生="是" 可选="123">
<姓名>&a;</姓名>
<年龄>22</年龄>
<性别></性别>
<爱好></爱好>
<爱好></爱好>
</学生>
</学生们>
==============================================================================================
详解例1(逐行分析):
1.<!DOCTYPE 学生们[:
以“学生们”为根节点,只能出现一次.
2.<!ELEMENT 学生们 (学生*)>:
设置“学生们”根节点可出现多个“学生子节点”.
3.<!ELEMENT 学生 (姓名+,年龄?,性别,爱好*)>:
设置”学生“节点后的子节点,加上特定的符号来控制标记出现的次数。这些符号见表1。
表1
----------------------------------------------------------
符号 代表标记出现的次数
? 不出现或只出现一次
* 不出现或可出现多次
+ 必须出现一次以上
无符号 只能出现一次
----------------------------------------------------------
例如:<!ELEMENT 学生 (姓名+,年龄?,性别,爱好*)>:
“姓名”标记必须出现一次以上;
“年龄”标记可以不出现或只出现一次;
“性别”标记必须出现而且只能出现一次
“爱好”标记在XML文件中可以不出现或者出现多次;
4.<!ATTLIST 学生 身份证号码 ID #REQUIRED>:
在学生节点中增加一个属性“身份证号码”:必须写,为ID,不能重复值,并且值不能为数字开头,关键字:#REQUIRED
5.<!ATTLIST 学生 可选 CDATA #IMPLIED>:
在学生节点中增加一个属性“可选”:此属性可写可不写,关键字:#IMPLIED.
6.<!ATTLIST 学生 婚否 (未婚|已婚) "已婚">:
在学生节点中增加一个属性“婚否”:此属性可写可不写,值必须是"未婚/已婚",相当于枚举,默认为"已婚".
7.<!ATTLIST 学生 是否好学生 CDATA "是">:
在学生节点中增加一个属性“是否好学生”:此属性可写可不写,有一个默认值:"是",但是也可以是其它的值.
8.<!ENTITY a "尹当">:
添加一个Entity实体,我们可以把Entity看作是一个常量,它有一定的值,本中例:&a;则相当于设定值"尹当",
引用Entity的时候,必须要在Entity名称前面加上“&&”符号,后面加上“;”符号。
注:
属性的取值范围表:
==============================================================================================
属性值类别 描述
cdata 属性值仅仅是一般的文字。
enumerated 列出该属性的取值范围,一次只能有一个属性值能够赋予属性。
nmtoken 表示属性值只能由字母、数字、下划线、. 、:、-这些符号组成。
nmtokens 表示属性值能够由多个nmtoken组成,每个nmtoken之间用空格隔开。
id 该属性在xml文件中是唯一的,常用来表示人的身份证号码。
idref 表示该属性值是参考了另一个id属性。
idrefs 表示该属性值是参考了多个id属性,这些id属性的值用空格隔开。
entity 表示该属性的设定值是一个外部的entity,如一个图片文件。
entities 该属性值包含了多个外部entity,不同的entity之间用空格隔开。
notation 属性值是在dtd中声明过的notation(声明用什么应用软件解读某些二进制文件,如图片)。
==============================================================================================
外部DTD:
外部DTD是一个独立于XML文件的文件,实际上也是一个文本文件,只是使用.dtd为文件扩展名。因为外部DTD独立于XML文件,那么它可以供多个XML文件使用,就像用同一个模板可以写出多个不同内容的文件一样,这多个XML文件因为是引用同一个外部DTD,所以它们的结构大致相同。
外部DTD的创建方式、语法和内部DTD是一样的,把例1的内部DTD的例子用外部DTD来写,文件如下所示。文件存为后缀名为 .dtd的文件。
-------------------------------------------------------------------------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 学生们 (学生*)>
<!ELEMENT 学生 (姓名+,年龄?,性别,爱好*)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 性别 (#PCDATA)>
<!ELEMENT 爱好 (#PCDATA)>
<!ATTLIST 学生 身份证号码 ID #REQUIRED>
<!ATTLIST 学生 可选 CDATA #IMPLIED>
<!ATTLIST 学生 婚否 (未婚|已婚) "已婚">
<!ATTLIST 学生 是否好学生 CDATA "是">
<!ENTITY a "尹当">
-------------------------------------------------------------------------------------------------------------------------------------------------------除了没有内部DTD中的〈!DOCTYPE 参考资料 [.....]〉语句外,其他都一样。而且有关元素数目、排列顺序、空元素设定、选择性元素、Entity声明、属性设定等都和内部DTD是一样的。
如何引用.dtd文件:
1.〈!DOCTYPE element-name SYSTEM DTD-URL〉
2.〈!DOCTYPE element-name PUBLIC DTD-name DTD-URL〉
此语句必须位于XML文件的文件序言区,其中,〈!DOCTYPE表示开始声明应用外部DTD;element-name是指该DTD的根元素的名称;SYSTEM是指该外部DTD文件是私有的,
即我们自己创建的,没有公开发行,只是个人或在公司内部或者几个合作单位之间使用;而PUBIC关键字是指该外部DTD是公用的,经过了公开讨论,用PUBLIC的DTD都有一个逻辑名称——DTD-name,我们必须在调用时指明这个逻辑名称。
DTD-URL是用URL的方式指明外部DTD文件的位置。例如,我们这份DTD文件存放在URL为:http://www.xml.com/这个地方,文件名为ckzl.dtd。
那么在XML文件中的声明如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 学生们 SYSTEM "http://www.xml.com/ckzl.dtd">
如存放于本机e:\ckzl.dtd
<!DOCTYPE 学生们 SYSTEM "e:\ckzl.dtd">
========================================
本文档有部分内容,借鉴于网络资料,感谢
========================================