注:学习DTD不推荐仅靠记忆,本文给出一些实例来帮助DTD语法的学习,复现实例能够对理解有所帮助。
元素
元素是XML的核心与灵魂。
DTD中使用 <!ELEMENT element-name element-definition>
来声明所有文档元素
元素类型
1.any
该元素可以包含任何在DTD中定义的元素内容
2.empty
该元素在XML文件中使用空元素标记,即元素中没有内容
3.#PCDATA
纯文本元素或称简单元素
可以包含任意字符数据,但是不能包含任何子元素
4.父元素类型
只包含子元素,并且除了子元素外没有文本,通过正则表达式规定子元素出现的顺序和次数,语法分析器将这些正则表达式与XML文档中的数据模式相匹配,判别出一个文档是否是Validating XML
符号 | 用途 |
---|---|
* | 允许出现任意多次 |
+ | 该对象至少出现一次 |
? | 该对象可以出现一次或零次 |
* | 允许出现任意多次 |
, | 对象必须按照指定的顺序出现 |
5.混合元素类型
请参考其它文章,不推荐使用
实例1——仅定义了元素的DTD文档:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT PRODUCTDATA (PRODUCT)+><!--PRODUCTDATA是根节点,子节点是PRODUCT并且它最少要出现一次-->
<!ELEMENT PRODUCT (PRODUCTNAME,DESCRIPTION,PRICE,QUANTITY)>
<!--PRODUCT下又有四个子节点,必须按照给定顺序出现-->
<!--这三个节点都是#PCDATA类型并且可以包含任何字符数据,不能包含任何子元素-->
<!ELEMENT PRODUCTNAME (#PCDATA)>
<!ELEMENT DESCRIPTION (#PCDATA)>
<!ELEMENT PRICE (#PCDATA)>
<!--QUANTITY is an empty element-->
<!ELEMENT QUANTITY EMPTY>
属性
属性是对元素的补充和修饰,它额能够将一些简单的特性和元素相关联。
四种特点的属性
1.#REQUIRED
必须赋值的属性 【required】
说明方式:
2.#IMPLIED
属性值可有可无的属性,不要求给该属性赋值,无需在DTD中提供默认值 【implied】
说明方式:
3.#FIXED value
固定取值的属性,需要为一个特定的属性提供一个默认值,并且不希望在XML文档中替换掉这个默认值 【fixed value(固定的值)】
说明方式:
4.Default value
事先定义了默认值的属性,需要在DTD中提供一个默认值,可以被XML文档中的属性值替换掉
说明方式:
属性类型
CDATA
纯文本/字符串
实例2——仅使用CDATA类型的XML文档
注意:该实例使用了内部DTD格式
<?xml version="1.0" encoding="GB2312"?>
<!--一个内部DTD的示例,首先写根元素“家庭”-->
<!--包含两个元素,人至少出现一次,家电可以出现人一次,这两个元素都被定义为空类型-->
<!DOCTYPE 家庭[
<!ELEMENT 家庭 (人+,家电*)>
<!ELEMENT 人 EMPTY>
<!ELEMENT 家电 EMPTY>
<!--开始定义属性-->
<!ATTLIST 人
名字 CDATA #REQUIRED
年龄 CDATA #REQUIRED
爱好 CDATA #IMPLIED
>
<!ATTLIST 家电
名称 CDATA #REQUIRED
数量 CDATA #REQUIRED
说明 CDATA #IMPLIED
>
]>
<!--DTD部分结束-->
<家庭>
<人 名字="张三" 年龄="25"/>
<人 名字="李四" 年龄="38" 爱好="踢足球"/>
<家电 名称="彩电" 数量="三" />
</家庭>
Enumerated
列举的,类似于数组,在()内被指定
ID
以属性值的方式被文档中某个元素定义唯一的标识,用以区分具有相同结构和相同属性值的不同元素
实例3
DTD
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 公司 ANY>
<!ELEMENT 公司职员 (#PCDATA)>
<!ATTLIST 公司职员
编号 ID #REQUIRED
姓名 CDATA #REQUIRED
>
XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 公司 SYSTEM "D:\我的文档\Documents\Altova\XMLSpy2014\Examples\Stduy_XML_example\DTD\example_2.dtd">
<!--编号被定义为ID,因此是不可重复的-->
<公司>
<公司职员 姓名="张三" 编号="Z001"/>
<公司职员 姓名="李四" 编号="Z002"/>
</公司>
IDREF/IDREFS
属性值引用已经定义的ID值,方法是把那个元素的ID标识符作为该元素的取值
不同的引用之间用空格分开
实例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 家庭[
<!ELEMENT 家庭 (人+)>
<!ELEMENT 人 EMPTY>
<!ATTLIST 人
relID ID #REQUIRED
parentID IDREFS #IMPLIED
name CDATA #REQUIRED
>
]>
<家庭>
<人 relID="P_1" name="爸爸"/>
<人 relID="P_2" name="妈妈"/>
<人 relID="P_3" parentID="P_1 P_2" name="儿子"/>
</家庭>
ENTITY
取值为一个已定义的实体
ENTITYS
该属性值包含多个外部的entity,不同的entity之间用空格分开
NMTOKEN
属性值只能由字母、数字、下划线…构成
本例仍然使用内部DTD
<?xml version="1.0" encoding="GB2312"?>
<!--一个内部DTD的示例,首先写根元素“poems”-->
<!DOCTYPE poems [
<!ELEMENT poems (title,content)>
<!ELEMENT title (#PCDATA)>
<!--定义属性,nmtoken说明该属性只能由数字、字母、下划线构成,当encoding编码是中文码时,可以使用中文-->
<!ATTLIST title author NMTOKEN #REQUIRED>
<!ELEMENT content (#PCDATA)>
]>
<!--DTD部分结束-->
<poems>
<title author="杜甫">八阵图</title>
<content>
功盖三分国,名成八阵图。
江流石不转,遗恨失吞吴。
</content>
</poems>
NUTOKEN
属性值能由多个nmtoken构成,每个nmtoken之间用空格隔开
NOTATION
取值为一个DTD声明中的符号,这个类型对于非XML格式的类型非常有用
预定义实体
XML和HTML都保留了一些字符用于自身格式的定义
引用时,参考下表:
这就是预定义实体。
XML还提供了另外一种引用方法:
字符 | 实体引用 |
---|---|
< | < |
> | > |
& | & |
’ | &apos |
" | " |
自定义实体
定义方法:
<!ENTITY entity-name "entity-content">实例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE COMPANY [
<!ELEMENT COMPANY (NAME, ADDRESS)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT ADDRESS (#PCDATA)>
<!ENTITY name "青岛">
<!ENTITY address "宁夏路">
]>
<COMPANY>
<NAME>&name; </NAME>
<ADDRESS>&address; </ADDRESS>
</COMPANY>
显示在浏览器中: