DTD学习笔记
引言:DTD的作用是定义XML文档的合法构建模块,DTD可被成行的声明于XML文档中,也可作为一个外部引用
示例:
<!DOCTYPE NEWSPAPER [
<!ELEMENT NEWSPAPER (ARTICLE+)>
<!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)>
<!ELEMENT HEADLINE (#PCDATA)>
<!ELEMENT BYLINE (#PCDATA)>
<!ELEMENT LEAD (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>
<!ELEMENT NOTES (#PCDATA)>
<!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED>
<!ATTLIST ARTICLE EDITOR CDATA #IMPLIED>
<!ATTLIST ARTICLE DATE CDATA #IMPLIED>
<!ATTLIST ARTICLE EDITION CDATA #IMPLIED>
]>
一、DTD简介
1、内部的DOCTYPE声明
假如DTD被包含在XML源文件中,语法如下:
<!DOCTYPE root-element [element-declarations]>
示例:
<?xml version="1.0"?>
<!DOCTYPE note [ //定义此文档是note类型的文档
<!ELEMENT note (to,from,heading,body)> //note元素有四个子元素:to,from,heading,body
<!ELEMENT to (#PCDATA)> //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、外部的文档声明
语法格式:
<!DOCTYPE root-element SYSTEM "filename">
3、为什么使用DTD
通过DTD,可使得每个XML文件均可携带一个有关自身格式的描述
使独立的团体可以使用同一格式来交换数据
方便接受数据(同上)
二、DTD构建模块
1、元素和属性: 元素也是HTML 和XMl的主要构建模块 (即标签)
2、实体:是用来定义普通文本的变量。 如:
< > & &qout; '
3、PCDATA
4、CDATA
三、元素
1、声明一个元素
在DTD中,元素须通过元素声明来声明。语法如下:
<!ELEMENT element-name category>
或
<!ELEMENT element-name (element-content)>
空元素:
<!ELEMENT element-name EMPTY>
只有PCDATA的元素
<!ELEMENT element-name (#PCDATA)>
示例:
<!ELEMENT from (#PCDATA)
带有任何内容的元素
<!ELEMENT element-name ANY>
示例:
<!ELEMENT note ANY>
带有子元素(序列)的元素
<!ELEMENT element-name (child1,child2,child3)>
示例:
<!ELEMENT note (to,from,heading,body)> //如果出现了该条声明,则被包含的子元素就必须被声明(如下四个子元素)
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
声明只出现一次的元素
<!ELEMENT element-name (Child-name)>
示例:
<!ELEMENT note (message)> //子元素message必须出现且只出现一次
<!ELEMENT message (#PCDATA)>
声明最少出现一次的元素
<!ELEMENT element-name (child-name+)>
示例:
<!ELEMENT note (message+)> //子元素message至少出现一次,出现次数不限
<!ELEMENT message (#PCDATA)>
声明出现0次或多次的元素
<!ELEMENT element-name (child-name*)>
示例:
<!ELEMENT note (message*)> //子元素message可以出现0次或多次
声明出现0次或一次的元素
<!ELEMENT element-name (child-name?)>
示例
<!ELEMENT note (message?)> //message可出现0次或一次,不能超过一次
声明"(非。。。|即。。。)"类型的内容
示例:
<!ELEMENT note (to,from,heading,body,(message|body)) //message和body元素二选一,可以是message也可以是body
声明混合型的内容
<!ELEMENT note (#PCDATA|to|from|header|message)*> //"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。
2、属性
声明属性
语法:
<!ATTLIST element-name attribute-name attribute-type attribute-value>
DTD示例:
<!ATTLIST payment type CDATA "check">
XML示例:
<payment type="check" />
属性类型选项
类型 描述
CDATA 值为字符数据 (character data)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值
默认属性值
值 解释
值 属性的默认值
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
3、实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量
一个实体的内部声明
语法:
<!ENTITY entity-name "entity-value"
实例:
DTD 实例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">
XML 实例:
<author>&writer;©right;</author>
注意: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。
一个实体的外部声明
语法:
<!ENTITY entity-name SYSTEM "URI/URL"
实例:
DTD 实例:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
XML example:
<author>&writer;©right;</author>
语法:
<!ENTITY entity-name SYSTEM "URI/URL"
实例:
DTD 实例:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
XML example:
<author>&writer;©right;</author>