DTD学习

Sl0th Lv4

DTD

简介

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部DOCTYPE声明

语法

1
<!DOCTYPE 根元素 [元素声明]>  <!--根元素是xml文件的根元素-->

带有 DTD 的 XML 文档实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Do not forget the meeting!</body>
</note>

以上 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
2
3
4
5
6
7
8
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Do not forget the meeting!</body>
</note>

包含的note.dtd文件

1
2
3
4
5
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

用处

通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述。

通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

元素

由闭合标签及内容(文本或空)构成

1
2
<body>body text in between</body>
<message>some message in between</message>

属性

提供有关元素的额外信息

元素为空时

1
<img src="computer.gif" />

元素有内容时

1
2
3
4
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

实体

实体是用来定义普通文本的变量。实体引用是对实体的引用。

下面的实体在 XML 中被预定义

实体引用 字符
&lt; <
&gt; >
&amp; &
&quot;
&apos;

PCDATA

PCDATA 的意思是会被解析的字符数据(parsed character data),字符数据就是闭合标签之间的文本内容

这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开。

1
<message>此文本也会被解析</message>

CDATA

CDATA 的意思是字符数据(character data)。CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

CDATA 部分由 <![CDATA[ 开始,由]]> 结束:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>

CDATA 部分不能包含字符串 “]]>”。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 “]]>” 不能包含空格或折行。

元素声明

语法

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:

1
2
1⃣️<!ELEMENT 元素名称 类别>
2⃣️<!ELEMENT 元素名称 (元素内容)>

空元素

利用关键字EMPTY

1
<!ELEMENT 元素名称 EMPTY>

案例

1
2
3
4
<!--dtd中声明-->
<!ELEMENT br EMPTY>
<!--XML中-->
<br />

只有PCDATA的元素

1
<!ELEMENT 元素名称 (#PCDATA)>

带有任何内容的元素

关键词ANY

1
<!ELEMENT 元素名称 ANY>

带有子元素(序列)的元素

带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

1
2
1⃣️<!ELEMENT 元素名称 (子元素名称 1)>
2⃣️<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)> <!--由逗号分隔开的序列进行声明并且按照相同的顺序出现在XML文档中-->

不同的元素声明

  • 子元素只出现一次:语法为:

    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子元素以及出现零次或多次的pricepressdate三个子元素中的一个

对于?*以及+这三个符号的含义,可以类比于正则表达式进行记忆

属性声明

语法

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
2
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">

合法的 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
2
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

1
<author>&writer;&copyright;</author>

一个实体由三部分构成: 一个和号 &, 一个实体名称, 以及一个分号 ;

外部实体声明

语法:

1
<!ENTITY 实体名称 SYSTEM "URI/URL"> <!--也可以用协议-->

💡不同环境下可用协议

aaa
aaa

🌰

DTD 例子:

1
2
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

1
<author>&writer;&copyright;</author>

实体的嵌套

1
2
<!ENTITY %实体名称 "值"> <!--内部-->
<!ENTITY %实体名称 SYSTEM "URL"> <!--外部-->

实体分类

实体又分为一般实体和参数实体,字符实体,命名实体

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 进行许可。
评论