DTD学习
DTD
简介
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
内部DOCTYPE声明
语法
1 | <!DOCTYPE 根元素 [元素声明]> <!--根元素是xml文件的根元素--> |
带有 DTD 的 XML 文档实例
1 | <?xml version="1.0"?> |
以上 DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:”to、from、heading,、body”
!ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型
!ELEMENT from (第五行)定义 from 元素为 “#PCDATA” 类型
!ELEMENT heading (第六行)定义 heading 元素为 “#PCDATA” 类型
!ELEMENT body (第七行)定义 body 元素为 “#PCDATA” 类型
外部文档声明
DTD位于XML源文件外部,语法
1 | <!DOCTYPE 根元素 SYSTEM "文件名"> |
实例
1 | <?xml version="1.0"?> |
包含的note.dtd文件
1 | <!ELEMENT note (to,from,heading,body)> |
用处
通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA
- CDATA
元素
由闭合标签及内容(文本或空)构成
1 | <body>body text in between</body> |
属性
提供有关元素的额外信息。
元素为空时
1 | <img src="computer.gif" /> |
元素有内容时
1 | <person sex="female"> |
实体
实体是用来定义普通文本的变量。实体引用是对实体的引用。
下面的实体在 XML 中被预定义
实体引用 | 字符 |
---|---|
< |
< |
> |
> |
& |
& |
" |
“ |
' |
‘ |
PCDATA
PCDATA 的意思是会被解析的字符数据(parsed character data),字符数据就是闭合标签之间的文本内容
这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。
1 | <message>此文本也会被解析</message> |
CDATA
CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
CDATA 部分由 <![CDATA[
开始,由]]>
结束:
1 | <script> |
CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分。
标记 CDATA 部分结尾的 “]]>” 不能包含空格或折行。
元素声明
语法
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
1 | 1⃣️<!ELEMENT 元素名称 类别> |
空元素
利用关键字EMPTY
1 | <!ELEMENT 元素名称 EMPTY> |
案例
1 | <!--dtd中声明--> |
只有PCDATA的元素
1 | <!ELEMENT 元素名称 (#PCDATA)> |
带有任何内容的元素
关键词ANY
1 | <!ELEMENT 元素名称 ANY> |
带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
1 | 1⃣️<!ELEMENT 元素名称 (子元素名称 1)> |
不同的元素声明
子元素只出现一次:语法为:
1
<!ELEMENT 元素名称 (子元素名称)>
子元素出现零次或一次:语法为:
1
<!ELEMENT 元素名称 (子元素名称?)>
子元素出现零次或多次:语法为:
1
<!ELEMENT 元素名称 (子元素名称*)>
子元素出现一次或多次:语法为:
1
<!ELEMENT 元素名称 (子元素名称+)>
子元素为多选一类型:语法为:
1
2
3<!ELEMENT 元素名称 (子元素名称1|元素名称2|子元素名称3|...)>
# 这里则不需要遵循子元素出现的顺序来写声明,只需包含所有可能出现的子元素即可(也可以添加一些不可能出现的元素,当然这样写并没有必要)
# 只能出现一个,不然会报错多种类型的子元素混合:举个例子:
1
<!ELEMENT book (name,author?,(price|press|date)*)>
这个声明的含义为:book
元素包含只出现一次的name
子元素、出现零次或一次的author
子元素以及出现零次或多次的price
、press
、date
三个子元素中的一个
对于
?
、*
以及+
这三个符号的含义,可以类比于正则表达式进行记忆
属性声明
语法
1 | <!ATTLIST 元素名称 属性名称 属性类型 默认值> |
DTD 实例:
1 | <!ATTLIST payment type CDATA "check"> |
XML 实例:
1 | <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 | 属性值是固定的 |
🌰–规定一个默认的属性值
DTD: 给square元素规定了一个默认值为0的width属性,”square” 被定义为带有 CDATA 类型的 “width” 属性的空元素
1 | <!ELEMENT square EMPTY> |
合法的 XML: 仍可以给被预定义的属性赋值
1 | <square width="100" /> |
#IMPLIED
属性不是必需的
语法
1 | <!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED> |
🌰
DTD:
1 | <!ATTLIST contact fax CDATA #IMPLIED> |
合法的 XML:
1 | <contact fax="555-667788" /> |
合法的 XML:
1 | <contact /> |
#REQUIRED
属性是必需的,适用于没有默认值选项,但强制要求提交属性值
语法
1 | <!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED> |
🌰
DTD:
1 | <!ATTLIST person number CDATA #REQUIRED> |
合法的 XML:
1 | <person number="5677" /> |
非法的 XML:
1 | <person /> |
#FIXED
属性值固定,预先定义属性值,不可更改(类比const)
语法
1 | <!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value"> |
🌰
DTD:
1 | <!ATTLIST sender company CDATA #FIXED "Microsoft"> |
合法的 XML:
1 | <sender company="Microsoft" /> |
非法的 XML:
1 | <sender company="W3School" /> |
列举属性值
语法:
1 | <!ATTLIST 元素名称 属性名称 (en1|en2|..) 默认值> |
DTD 例子:
1 | <!ATTLIST payment type (check|cash) "cash"> |
XML 例子:
1 | <payment type="check" /> |
或者
1 | <payment type="cash" /> |
实体声明
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
内部实体声明
语法:
1 | <!ENTITY 实体名称 "实体的值"> |
🌰
DTD 例子:
1 | <!ENTITY writer "Bill Gates"> |
XML 例子:
1 | <author>&writer;©right;</author> |
一个实体由三部分构成: 一个和号
&
, 一个实体名称, 以及一个分号;
外部实体声明
语法:
1 | <!ENTITY 实体名称 SYSTEM "URI/URL"> <!--也可以用协议--> |
💡不同环境下可用协议
🌰
DTD 例子:
1 | <!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> |
XML 例子:
1 | <author>&writer;©right;</author> |
实体的嵌套
1 | <!ENTITY %实体名称 "值"> <!--内部--> |
实体分类
实体又分为一般实体和参数实体,字符实体,命名实体
1,一般实体的声明语法:
引用实体的方式:&实体名;
2,参数实体只能在DTD中使用,参数实体的声明格式:
引用实体的方式:%实体名;
有SYSTEM关键字引用数据的实体就是参数实体
- 标题: DTD学习
- 作者: Sl0th
- 创建于 : 2022-04-21 12:35:43
- 更新于 : 2024-11-11 18:23:06
- 链接: http://sl0th.top/2022/04/21/DTD学习/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。