1. 内部的 DOCTYPE 声明
当需要把 DTD 被包含在 xml 源文件中,则:
<!DOCTYPE 根元素 [元素声明]>
Example:
<?
xml
version
="1.0"
encoding
="GB18030"
?>
<!DOCTYPE chinese [
<!ELEMENT chinese (people*)>
<!ELEMENT people (name,sex,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
< chinese >
< people >
< name >咚咚 </ name >
< sex >男 </ sex >
< age >8 </ age >
</ people >
< people >
< name >小花 </ name >
< sex >女 </ sex >
< age >5 </ age >
</ people >
</ chinese >
<!DOCTYPE chinese [
<!ELEMENT chinese (people*)>
<!ELEMENT people (name,sex,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
< chinese >
< people >
< name >咚咚 </ name >
< sex >男 </ sex >
< age >8 </ age >
</ people >
< people >
< name >小花 </ name >
< sex >女 </ sex >
< age >5 </ age >
</ people >
</ chinese >
2.外部DTD
更多时候,我都会把 DTD 和 xml 源文件分离的,因此我们需要在xml源文件引用DTD:
更多时候,我都会把 DTD 和 xml 源文件分离的,因此我们需要在xml源文件引用DTD:
<!DOCTYPE 根元素 SYSTEM "DTD文件名">
xml file:
<?
xml
version
="1.0"
encoding
="GB18030"
?>
<!DOCTYPE chinese SYSTEM "chinese.dtd">
< chinese >
< people >
< name >咚咚 </ name >
< sex >男 </ sex >
< age >8 </ age >
</ people >
< people >
< name >小花 </ name >
< sex >女 </ sex >
< age >5 </ age >
</ people >
</ chinese >
<!DOCTYPE chinese SYSTEM "chinese.dtd">
< chinese >
< people >
< name >咚咚 </ name >
< sex >男 </ sex >
< age >8 </ age >
</ people >
< people >
< name >小花 </ name >
< sex >女 </ sex >
< age >5 </ age >
</ people >
</ chinese >
DTD file:
<!ELEMENT chinese (people*)>
<!ELEMENT people (name,sex,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT people (name,sex,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
3. 公用DTD
<!DOCTYPE 根元素名
PUBLIC " DTD的标识名" "DTD的URL"
>
PUBLIC " DTD的标识名" "DTD的URL"
>
Example:
<!DOCTYPE html
PUBLIC "-//W3C//DTD HTML 3.2//EN"
"http://www.w3.org/TR/HTML/html.dtd">
PUBLIC "-//W3C//DTD HTML 3.2//EN"
"http://www.w3.org/TR/HTML/html.dtd">
ELEMENT元素
声明一个element :
<!ELEMENT 元素名称 类别>
or
<!ELEMENT 元素名称 (元素内容)>
- 1. 空元素
<!ELEMENT 元素名称 EMPTY>
- 2. 任意类型的元素
带有任何内容(字符串、子元素、空元素)的元素,通过类别关键词ANY声明的元素,可包含任何可解析数据的组合:<!ELEMENT 元素名称 ANY>应尽量避免使用ANY定义。
-
3. 字符串值的元素
通过圆括号中的#PCDATA进行声明:<!ELEMENT 元素名称 (#PCDATA)> -
4. 带有子元素(序列)的元素
定义要求顺序的子元素:<!ELEMENT 元素名称 (子元素名称1, 子元素名称2, ...)>定义互斥的子元素:<!ELEMENT 元素名称 (子元素名称1 | 子元素名称2 | ...)> -
5. 混合型元素<!ELEMENT 父元素名称 (#PCDATA | 子元素名)*>#PCDATA必须在第一位,可选的子元素可任意多项。
Example: <!ELEMENT 计算机书籍 (#PCDATA | 书名 | 作者 | 价格 | 简介)*>

+ 表明子元素可以出现一次或多次;
* 表明子元素可以出现零次或多次;
? 表明子元素可以出现零次或一次。
ATTLIST属性
声明一个属性
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型
- CDATA
任意文本字符串。DTD不能指定属性为一个整数或一个日期,Schema能提供更为强大的数据类型 - ID
值为唯一的数字。由于数字不是合法的XML名称,所以ID编号不能以数字开头,解决办法是在前面加下划线或字母。 - IDREF
指向文档中某元素的ID类型的属性。如:< project project_id ="p1" >project元素的project_id属性和person元素的card_id属性应该是ID类型。
< goal >deploy linux </ goal >
< team_member person_card_id ="c123" />
</ project >
< person card_id ="c123" >
< name >linuxsir </ name >
< assignment project_project_id ="p1" />
</ person >
team_member元素的 person_card_id属性和assignment元素的project_project_id属性是IDREF类型。对应的声明如下:<!ATTLIST person card_id ID #REQUIRED>
<!ATTLIST project project_id ID #REQUIRED>
<!ATTLIST team_member person_card_id IDREF #REQUIRED>
<!ATTLIST assignment project_project_id IDREF #REQUIRED>
-
IDREFS
当某个元素需要引用多个其他元素时使用该元素。如:<!ATTLIST person card_id ID #REQUIRED对应的文档可写成:
assignment IDREFS #REQUIRED>
<!ATTLIST project project_id ID #REQUIRED
team IDREFS #REQUIRED>< project project_id ="p1" team ="c123" >
< gold >deploy linux </ gold >
</ project >
< person card_id ="c123" assignment ="p1" >
< name >Linuxsir </ name >
</ person >
-
(value1 | value2 | ...)
枚举候选值,默认值为其中一个
-
ENTITY
ENTITY类型的属性包含在DTD的其它位置声明的未析实体的名称中。如movie元素可能有一个标识激活时播放mpeg或rm文件的实体属性:
<!ATTLIST movie src ENTITY #REQUIRED>
如果DTD声明了一个名为play的未析实体,则此movie元素可用于在XML文档中嵌入视频文件:
<movie src="play" />
-
ENTITIES
ENTITIES类型的属性包含在DTD的其它位置声明的多个未析实体名称,其间用空白隔开。
<!ATTLIST slide_show slides ENTITIES #REQUIRED>
如果DTD声明了未析实体slide1、slide2、slide3、...,则可使用slide_show元素在XML文档中嵌入幻灯片。
<slide_show slides="slide1 slide2 slide3" />
-
NMTOKEN
NMTOKEN 类型属性值是一个XML名称记号。XML名称记号与XML名称类似,但XML名称记号允许所有的字符作为名称的开始字符,而XML名称的第一个字母必须是 字母、表意字符和下划线。因此10,.bashrc是合法的XML名称标记,但不是合法的XML名称。每个XML名称都是一个XML名称标记,然而XML 名称标记不全是XML名称。如果属性包含1990,2005之类的整数,则应该指定其类型为NMTOKEN。如:
<!ELEMENT person birthday NMTOKEN #REQUIRED>
-
NMTOKENS
NMTOKENS类型属性包含一个或多个用空白分隔的XML名称记号。如:
<person dates="02-01-2005 03-01-2005 05-01-2005">person</person>
对应的声明应为:
<!ATTLIST person dates NMTOKENS #REQUIRED>
另一方面,对01/02/2005这样的形式不能使用该声明,因为其中的正斜杠不是合法的名称字符。
-
xml:
值是一个预定义的 XML 值
-
NOTATION
NOTATION类型的属性包含在文档的DTD中声明的某个记法的名称。该属性类型较少用。理论上,可以使用该属性使某些特殊元素与类型相关联,下例声明为不同的图像类型定义了4个记法,然后规定每个image元素都必须从中选择一种type属性。
<!NOTATION gif SYSTEM "image/gif">
<!NOTATION tiff SYSTEM "image/tiff">
<!NOTATION jpeg SYSTEM "image/jpeg">
<!NOTATION png SYSTEM "image/png">
<!ATTLIST image type NOTATION (gif | tiff | jpeg | png) #REQUIRED>
每个image元素的type属性的值可以为gif,tiff,jpeg和png四个值中的一个。该属性比枚举类型稍具优势,因为记法 的实际MIME媒体类型在理论上是可用的。由于斜杠在XML名称中不是一个合法字符,所以枚举类型不能指定image/png或image/jpeg作为 允许值。
属性默认值
1.
#IMPLIED,属性可选。
2.
#REQUIRED,属性必须有。
3.
#FIXED,属性是常量,不能更改。
<!ATTLIST person name CDATA #FIXED "charley">
4. 实际值
<!ATTLIST person QUANT CDATA "1">
ENTITY实体
实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。
一个内部实体声明
<!ENTITY 实体名称 "实体的值">
DTD example:
<!ENTITY writer "charley">
<!ENTITY copyright "Copyright icansoft.blog.51cto.com">
<!ENTITY copyright "Copyright icansoft.blog.51cto.com">
xml example:
<
author
>&writer;©right;
</
author
>

一个外部实体声明
可定义一个外部实体,引用外部XML文档
<!ENTITY 实体名称 SYSTEM "URI/URL">
DTD example:
<!ENTITY writer SYSTEM "http://www.w3c.com/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "/xml/copyright.xml">
<!ENTITY copyright SYSTEM "/xml/copyright.xml">

<!ENTITY % person "name,address,postcode">
引用方法%person;
这样会用name,address,postcode代替参数实体%person;
PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。
CDATA
CDATA 的意思是字符数据(character data)。
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
本文转自 Icansoft 51CTO博客,原文链接:
http://blog.51cto.com/android/109790