02 XML DTD
一、DTD 简介
DTD (Document Type Definition 文档类型定义)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
二、DTD 文档声明
-
内部声明
基本格式:<!DOCTYPE 根元素 [元素声明]>
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> ]> <note> <to>George</to> <from>John</from> </note>
以上 DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:“to、from、heading,、body”
!ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型
!ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型 -
外部引用
基本格式:<!DOCTYPE 根元素 SYSTEM "文件名">
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> </note>
外部引用文件:note.dtd
<!ELEMENT note (to,from)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)>
三、DTD - XML 构建模块
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="001">
<name>张三</name>
<age>18</age>
<hobby>篮球</hobby>
</student>
<student id="002">
<name>李四</name>
<age>25</age>
<hobby>足球</hobby>
</student>
</students>
XML 构建模块构成:
- 元素
students 、student 、name 、age 、hobby
都是元素 - 属性
id="001"
,其中id
是属性,"001"
是属性值 - PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。 - CDATA
CDATA 的意思是字符数据(character data)。
CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
四、DTD 元素
-
声明一个元素
<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>
-
空元素
<!ELEMENT 元素名称 EMPTY>
-
只有 PCDATA 的元素
<!ELEMENT 元素名称 (#PCDATA)>
-
带有任何内容的元素
<!ELEMENT 元素名称 ANY>
-
带有子元素(序列)的元素
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
-
声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>
-
声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称*)>
-
声明出现零次或一次的元素
<!ELEMENT 元素名称 (子元素名称?)>
-
声明“非…/既…”类型的内容
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:“note” 元素必须包含 “to” 元素、“from” 元素、“header” 元素,以及非 “message” 元素既 “body” 元素。 -
声明混合型的内容
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了:“note” 元素可包含出现零次或多次的 PCDATA、“to”、“from”、“header” 或者 “message”。
五、DTD 属性
-
属性声明
属性声明使用下列语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
-
属性类型的选项
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1 | en2 |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml: | 值是一个预定义的 XML 值 |
- 默认值参数可使用值
值 | 解释 |
---|---|
值 | 属性的默认值 |
#REQUIRED | 属性值是必需的 |
#IMPLIED | 属性不是必需的 |
#FIXED value | 属性值是固定的 |
六、DTD 实体
-
内部实体定义
<!ENTITY 实体名称 "实体的值">
示例: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ELEMENT note (name)> <!ELEMENT name (#PCDATA)> <!ENTITY write "张三"> ]> <note> <name>&write;</name> </note> //一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。
-
外部引用实体
<!ENTITY 实体名称 SYSTEM "URI/URL">