DTD(Document Type Definition)文件类型描述
第一点要注意的:
DTD中的关键字必须全部大写!
一、DTD的位置
DTD可以放在xml文档里面:
出自《XML入门》
<?
xml version = "1.0" encoding="GB2312" standalone = "yes"
?>
<!
DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 (联系人)*
>
<!
ELEMENT 联系人 (姓名,ID,公司,EMAIL,电话,地址)
>
<!
ELEMENT 地址 (街道,城市,省份)
>
<!
ELEMENT 姓名 (#PCDATA)
>
<!
ELEMENT ID (#PCDATA)
>
<!
ELEMENT 公司 (#PCDATA)
>
<!
ELEMENT EMAIL (#PCDATA)
>
<!
ELEMENT 电话 (#PCDATA)
>
<!
ELEMENT 街道 (#PCDATA)
>
<!
ELEMENT 城市 (#PCDATA)
>
<!
ELEMENT 省份 (#PCDATA)
>
]>
<
联系人列表
>
...................................
放在里面的时候,应该注意“standalone = "yes"”
也可以放在外面,放在外面有两种形式,一种是引用本地文件,如:
<?
xml version = "1.0" encoding="GB2312" standalone = "no"
?>
<!
DOCTYPE 联系人列表 SYSTEM "fclml.dtd"
>
<
联系人列表
>
..................
引用的格式是:<!DOCTYPE 根元素名 SYSTEM "外部DTD文件的URL">
另外一种是引用公共的文档定义,如:
<!
DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"
>
格式为:<!DOCTYPE 根元素 PUBLIC "DTD名称" "外部DTD的URL">
其中DTD名称解释为:
这个DTD标识的命名规则和XML文件的命名规则稍有不同。具体地说,DTD名称只能包含字母、数字、空格和下面的符号:
_%$#@()+:=/!*;?。同时,DTD名称还必须符合一些标准的规定。例如,ISO标准的DTD以“ISO”三个字母开头;被改进的非ISO标准的DTD以加号“+”开头;未被改进的非ISO标准的DTD以减号“-”开头。
所以说struts的配置文件就是“未被改进的非ISO标准的DTD文档”
二、DTD的内容
DTD文档的内容总结下来有几个比较重要也比较常用的:参数实体定义、元素定义和属性定义
1、参数实体定义
实体实际上在XML当中充当宏定义或者别名之类的意思,也可以理解成public static String......
参数实体是专门用在DTD当中的,你可以在下面两项元素定义和属性定义中引用参数实体。
其定义方式如下:
<!ENTITY % 实体名 "实体内容"> 注意,在XML中的实体定义是没有%的
或者是:
<!ENTITY % 实体名 SYSTEM "外部文件名">
引用方式:
%实体名
例子:
<!ENTITY % Boolean "(true|false|yes|no)">表示定义了一个Boolean 的参数实体,值是"(true|false|yes|no)"
在struts的配置文件的DTD中有如下描述:
<!ATTLIST form-bean dynamic %Boolean; #IMPLIED>
也就定义了form-bean这个元素的dynamic属性可以取得值是true、false、yes、no其中之一。
2、元素定义
用来定义元素的格式以及元素的子孙等。
定义形式:
<!ELEMENT 元素名 元素内容描述>
元素定义这里由于篇幅有限,仅列几个例子
1、<!ELEMENT 联系人列表
ANY>表示联系人列表这个元素的格式及其子孙都不受限制。
2、<!ELEMENT 姓名(#PCDATA)>表示姓名这个元素只能包含文本数据
3、<!ELEMENT 联系人(姓名 EMAIL)>表示联系人这个元素只能包含姓名和EMAIL两种子孙,顺序不限,并且姓名只能由一个,EMAIL也只能由一个。
4、<!ELEMENT 联系人(姓名,EMAIL)>表示联系人这个元素只能包含姓名和EMAIL两种子孙,有顺序的限制,并且姓名只能由一个,EMAIL也只能由一个。
5、<!ELEMENT 联系人(姓名,EMAIL
+)>表示联系人必须有且仅有一个姓名子孙,有一个到多个EMAIL子孙,其中,如果
+换作
*,则表示零个或者多个。
6、<!ELEMENT 联系人(姓名,EMAIL)+>表示联系人有一组到多组子孙,每组中有且仅有一对姓名和EMAIL
7、<!ELEMENT 联系人(姓名,(电话
|EMAIL))>表示联系人有一组到多组子孙,每组中第一个元素一定是姓名,第二个元素要么是电话,要么是EMAIL,两者选一个。
8、<!ELEMENT 联系人
EMPTY>联系人这个元素不包含任何子孙,也不包含文本。
3、属性定义
格式:<!ATTLIST 元素名 (属性名 属性类型 缺省值)*>
例子:
1、<!ATTLIST 页面作者
姓名 #CDATA #IMPLIED
年龄 #CDATA #IMPLIED
联系信息 #CDATA #REQUIRED
网站职务 #CDATA #FIXED "页面作者"
个人爱好 #CDATA "上网">
其中,定义了页面作者这个元素的属性可以有“姓名”,“年龄”,“联系信息”,“网站职务”和“个人爱好”
并且,姓名和年龄是纯文本,可以没有,联系信息必须有,网站职务一定是“页面作者”,个人爱好如果不填,则默认是上网。
2、<!ATTLIST 肉 类型( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">元素肉可以有“类型”属性,类型属性可以选择 鸡肉 | 牛肉 | 猪肉 | 鱼肉其中一个,默认是“鸡肉”
3、<!ATTLIST 联系人 编号 ID #REQUIRED>联系人元素有且必须有编号属性,其类型是ID型的,ID型或者是IDREF型的属性值必须是一个有效的XML名称,它由字母、数字或下划线开始,名字中不能出现空白符。类似Html中的ID。
4、另外类型NMTOKEN和NMTOKENS还有NOTATION类型我还不是太明白,那位明白的不妨给出^_^。