一。简介
DTD 指定:可以在文档中存在的元素、那些元素可以具有的属性、在元素内部元素的层次结构以及元素在整个文档中出现的顺序。
虽然 DTD 不是必需的,但它们确实带来方便。DTD 适合三个基本用途。它能:
- 对标记编制文档
- 加强标记参数内部的一致性
- 使 XML 语法分析器能够确认文档
二。DTD的一个例子
以下面这个xml为例:
- <?xml version="1.0" encoding="UTF-8"?>
- <books>
- <book show="yes">
- <title>Dom4j Tutorials</title>
- </book>
- <book show="yes">
- <title>Lucene Studing</title>
- </book>
- <book show="no">
- <title>Lucene in Action</title>
- </book>
- <owner>O'Reilly</owner>
- </books>
在xml文件中加入验证声明,如下(以book.dtd作为验证文件)
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE books PUBLIC "//UNKNOWN/" "book.dtd">
- <books>
- <book show="yes">
- <title>Dom4j Tutorials</title>
- </book>
- <book show="yes">
- <title>Lucene Studing</title>
- </book>
- <book show="no">
- <title>Lucene in Action</title>
- </book>
- <owner>O'Reilly</owner>
- </books>
编写book.dtd如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!ELEMENT books (book*,owner)>
- <!ELEMENT book (title)>
- <!ATTLIST book
- show CDATA #REQUIRED
- >
- <!ELEMENT title (#PCDATA)>
- <!ELEMENT owner (#PCDATA)>
这个时候如果在book.xml中将owner元素挪到book元素下面,验证就会报错:)
三。语法详解(book.dtd):
1.<!ELEMENT books (book*,owner)>
1)作用:声明了根元素books,并且其中可以包含0--n个book元素,有且只有一个owner元素。
2)其中用到的符号含义如下:
符号 | 代表标记出现的次数 |
? | 不出现或只出现一次 |
* | 不出现或可出现多次 |
+ | 必须出现一次以上 |
无符号 | 只能出现一次 |
3)其他例子:(假设A、B、C 和 D 是在下例中代表元素的变量。)
元素必须有正好一个 A
、至少一个 B
(由加号表示)、零个或多个 C
(由星号表示)以及零个或一个 D
(由问号表示):
|
元素可能有 A
或 B
或 C
之一:
|
元素不包含任何内容:
|
元素可以包含在 DTD 中列出的任何元素:
|
元素可能包含经过语法分析的字符数据或另一个元素( element2
)。星号(*)表示混合内容模型 — 其中元素可以包含不同类型的属性。
|
2.<!ATTLIST book
show CDATA #REQUIRED
>
1)作用:声明了book元素下的属性列表。 show属性必须出现
2)用到的符号:
属性内定值 | 描述 |
#required | 表示在标记中必须出现此属性。 |
#implied | 标记中可以不出现此属性。 |
#fix | 属性的值是固定的某个值。 |
字符串 | 标记中如没有指定属性的值,那么此字符串就是此属性的值。 |
3)其他例子
下例表明其元素是一个包含三个属性的空标记:属性 1( att1
)是一个可选属性,属性 2( att2
)是带有固定值 "A"
的属性,属性 3( att3
)是必需的文本属性。
|
可以看到在 XML 文档中使用的这个元素如下:
|
属性 CDATA
表示包括的信息应该是文本。 ID
属性表明必须填入唯一的标识。每个元素只能有一个 ID
属性。另外, CDATA
表示 att2
和 att3
可能包含任何字符串。
3.更多的属性字段:
属性值类别 | 描述 |
cdata | 属性值仅仅是一般的文字。 |
enumerated | 列出该属性的取值范围,一次只能有一个属性值能够赋予属性。 |
nmtoken | 表示属性值只能由字母、数字、下划线、.、:、-这些符号组成。 |
nmtokens | 表示属性值能够由多个nmtoken组成,每个nmtoken之间用空格隔开。 |
id | 该属性在xml文件中是唯一的,常用来表示人的身份证号码。 |
idref | 表示该属性值是参考了另一个id属性。 |
idrefs | 表示该属性值是参考了多个id属性,这些id属性的值用空格隔开。 |
entity | 表示该属性的设定值是一个外部的entity,如一个图片文件。 |
entities | 该属性值包含了多个外部entity,不同的entity之间用空格隔开。 |
notation | 属性值是在dtd中声明过的notation(声明用什么应用软件解读某些二进制文件,如图片)。 |