一、什么是DTD
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
DTD的实例:
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
]>
以上为声明在XML文件中的一个DTD示例
简单来说,dtd可以约束你在XML文件中写的标签和属性等相关信息。
二、DTD的三种引入方式
(1)引入外部的dtd文件
<!DOCTYPE 根元素的名称 SYSTEM “dtd文件路径”>
(2)使用内部dtd,即将dtd内容直接写在XML文件中
<!DOCTYPE 根元素的名称 [DTD文件中的内容]>
(3)使用网络上的dtd文件
<!DOCTYPE 根元素的名称 PUBLIC “DTD名称” “DTD文档的url”>
上图是一个使用网络dtd文件的示例。
三、使用dtd来定义元素
(1)语法
<!ELEMENT 元素名称 元素约束>
(2)简单元素和复杂元素
简单元素:就是没有子元素的元素
<!ELEMENT name (#PCDATA)>
(#PCDATA)就代表一种约束,约束简单元素name标签内部只能放字符串,相似的还有EMPTY和ANY表示简单元素里面不放东西,为一个空标签或者里面可以放任意类型(可以为空,也可以放字符串)
复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
例如:
<!ELEMENT person (name,age,school)>
则代表person元素只有三个子元素name,age,school
<person>
<name>zhangsan</name>
<age>20</name>
<school>ZJU</school>
</person>
但是以上定义的子元素只能出现一次,但要是想出现多次,就需要用到一些特殊符号(这和正则匹配的规则有相似之处)
+ :表示一次或者多次
* :表示0次或者多次
? :表示0次或者一次
例如
<!ELEMENT person (name+,age*,school?)>
则代表person内子标签name至少得出现一次,age可以出现0次或者多次,school可以出现0次或者一次
四、使用dtd来定义属性
(1)语法
<!ATTLIST 元素名称
属性名称 属性类型 属性约束
>
(2)属性类型
有三种:
-
CDATA:表示属性的取值为普通的字符串
-
ENUMERATED:表示枚举,只能从枚举类型中任选其一
-
ID:表示属性的取值不能重复,属性的值只能由字母、下划线开头,不能出现空白字符
(3)属性约束
有三种: -
#REQUIRED:表示该属性必须出现
-
#IMPLIED:表示该属性可有可无
-
#FIXED:表示该属性为一个固定值,语法:#FIXED “固定值”
-
直接值:表示填写了该属性时为填写的属性值,没有填写为该默认值
定义属性示例:
五、定义引用实体
(1)语法:
<!ENTITY 实体名称 “实体内容”>
定义了实体之后,就可以在XML中使用
&实体名称;
XML中会自动用实体内容替代,这样可以简化代码