Document Type Definition
目录
DTD综述:
DTD就是Document Type Definition的缩写,它主要对与之相关联的XML文档中的元素、属性、实体、记号进行定义,以确保关联的文档在修改时能够维持文档结构和内容的合法性。但是XML Schema与DTD的作用是一样的,更为可观的是,XML Schema能够提供对数据类型和名词空间的支持。所以,在不久的将来,DTD应该会被XML Schema所取代。就我个人对DTD的使用感觉而言,这并非一个很好的XML结构观察工具,因为DTD对XML中的各个部分的定义显得松散而凌乱,完全没有学到XML的层次感,并不适合用于非常复杂的XML文档。
DTD的引入:
一个DTD文档可以定义在与之相关的XML文档的内部也可以作为一个单独的文件被一个或是多个XML文档所关联:
1. 引入内部DTD:
<?xml version="1.0" encoding=”UTF
-8”
standalone=”Yes”?>
<!DOCTYPE note [ //DOCTYPE后空格接该XML的根节点
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
2. 引入外部DTD:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd"> //SYSTEM是关键字,还有PUBLIC
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
概念:DTD是Document Type Definition 的缩写,它定义了与之相关的XML文档所有合法的元素和属性。
DTD中声明XML元素:
DTD中一共可以把元素分为五种类型:
1. 空元素
<!ELEMENT element-name EMPTY>
Example:
<!ELEMENT br EMPTY>
XML example:
<br />
2. 已解析的字符内容的元素
<!ELEMENT element-name (#PCDATA)>
Example:
<!ELEMENT from (#PCDATA)>
3. 任意内容的元素
<!ELEMENT element-name ANY>
Example:
<!ELEMENT note ANY>
4. 内容为子元素的元素
<!ELEMENT element-name (child1,child2,...)>
Example:
<!ELEMENT note (to,from,heading,body)>
注意:子元素必须按其在父元素中出现的顺序依次出现
4.1 每个子元素出且仅出现一次:
<!ELEMENT element-name (child1,child2,...)>
Example:
<!ELEMENT note (to,from,heading,body)>
4.2 每个子元素至少出现一次:
<!ELEMENT element-name (child1+,child2+,...)>
Example:
<!ELEMENT note (to+,from+,heading+,body+)>
4.3 每个子元素可以出现任意次(包括不出现):
<!ELEMENT element-name (child1*,child2*,...)>
Example:
<!ELEMENT note (to*,from*,heading*,body*)>
4.4 只可能不出现或是出现一次的元素:
<!ELEMENT element-name (child1?,child2?,...)>
Example:
<!ELEMENT note (to?,from?,heading?,body?)>
4.5 不可同时出现的子元素:
<!ELEMENT element-name (child1 | child2 | ,...)>
Example:
<!ELEMENT note (to,from,(heading | body))>
5. 混合内容的元素
Example:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
DTD中声明XML属性:
通用的语法格式:
<!ATTLIST element-name attribute-name attribute-type default-value>
DTD example:
<!ATTLIST payment type CDATA "check">
XML example:
<payment type="check" />
属性的类型(attribute-type)有如下几种:
Type | Description |
CDATA | 字符串值,如 “check” |
(en1|en2|..) | 只能从en1到enn中任选一值 |
ID | ID类型的属性是全局唯一的 |
IDREF | 它的取值必须是前面已经出现过的ID值 |
IDREFS | 它的取值必须是前面已经出现过的ID值们,用空格分隔 |
NMTOKEN | The value is a valid XML name |
NMTOKENS | The value is a list of valid XML names |
ENTITY | The value is an entity |
ENTITIES | The value is a list of entities |
NOTATION | The value is a name of a notation |
xml: | The value is a predefined xml value |
属性自身的属性(default-value):
Value | Explanation | Example |
Default Value | 属性的默认值
| DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0"> Valid XML:
<square width="100" /> |
#REQUIRED | 属性必须在XML文档中出现 | DTD:
<!ATTLIST person number CDATA #REQUIRED> Valid XML:
<person number="5677" />
Invalid XML:
<person /> |
#IMPLIED | 属性可以不在XML文档中出现 | DTD:
<!ATTLIST contact fax CDATA #IMPLIED> Valid XML:
<contact fax="555-667788" />
Valid XML:
<contact />
|
#FIXED value | 属性的值固定了 | DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft"> Valid XML:
<sender company="Microsoft" />
Invalid XML:
<sender company="W3Schools" /> |
DTD中定义XML的实体:
实体可以分为一般实体和参数实体,而一般实体又可以分为内部实体和外部实体:
1. 一般实体
1.1 内部实体
定义的语法:<!ENTITY entity-name "entity-value">
DTD Example:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
XML example:
<author>&writer;©right;</author>
1.2 外部实体
定义的语法:<!ENTITY entity-name SYSTEM "URI/URL">
DTD Example:
<!ENTITY writer SYSTEM "http://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/entities.dtd">
XML example:
<author>&writer;©right;</author>
外部已分析实体的写法:
<?xml version=”
1.0”
encoding=”TF
-8”
>
entity-value
注意,version属性是可选的,没有standalone的属性,只有entity-value的内容才会用来替换。
2. 参数实体
参数实体不能在XML文档中出现,只能在单独的DTD文档中被定义和使用(部的DTD不能定义和使用)。它能出现在所有tag出现的同阶位置,而且在DTD中以% y-name;的形式被引用。
定义的语法:<!ENTITY % y-name "entity-value">