【C# XML 】DTD(Document Type Definition):文档类型定义

DTD(Document Type Definition):文档类型定义

文档类型定义 (DTD) 语言是 XML 规范的本机语言,它是一种架构语言,其功能相对有限,但除了架构的表达式之外,它在 XML 中还有其他用途。

 

DTD应用范围

xHTML 、HTML、XML 类型的文件中

<!DOCTYPE 根元素 *.dtd> 用于在xHTML 、HTML、XML 文件中引用*.dtd文件,告诉浏览器使用那个dtd框架约束
 XML Schema 使用命名空间 所以不需要<!DOCTYPE 根元素> 告诉浏览器使用那个dtd框架约束

HTML5只有一种标准模式,HTML5不在基于SGML 所以没有其他框架模式。但是为了HTML5文件兼容之前浏览器 尤其是IE9之前的浏览器 启用标准模式解析html5文件,所以必须写<!DOCTYPE>。

 

为什么使用 DTD?

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

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

而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

您还可以使用 DTD 来验证您自身的数据。

 

 

DTD的局限性:

1、DTD不遵守XML语法
2、DTD数据类型有限
3、DTD不可扩展
4、DTD不支持命名空间

XML引入DTD的方式(2种):

注意:!DOCTYPE 不是 HTML 标签, 它是一条指令。 告诉浏览器采用那个dtd 约束文档

一种是直接写在xml文件内
一种是引入外部xml文件

1、一种是直接写在xml文件内 

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE root-element [element-declarations]>

带有 DTD 的 XML 文档实例(请在 IE5 以及更高的版本打开,并选择查看源代码):

<?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>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>

解释:

  • !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
  • !ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
  • !ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
  • !ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 类型
  • !ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
  • !ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

 

2、一种是引入外部xml文件

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE root-element SYSTEM "filename">

注解:root-element为根元素

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd

">
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

这是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

 

 

 

DTD的应用

DTD在html中的应用,html也是xml。

 

//HTML5
<!DOCTYPE html>//HTML5不基于SGML,所以不需要引用DTD。在HTML5中<!DOCTYPE>只有一种

//HTML4.01中,<!DOCTYPE>声明引用DTD,因为HTML4.01基于SGML。DTD规定了标记语言的规则,这样浏览器才能正确的呈现内容。在HTML4.01中有三种<!DOCTYPE>声明。

严格模式:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "http://www.w3.org/TR/html4/strict.dtd">

过渡模式:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">

框架模式:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"  "http://www.w3.org/TR/html4/fr

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

 

应用二

<title>自制一碗终极降糖餐!十大降血糖食物一次看</title>
        <link>https://www.epochtimes.com/gb/22/3/26/n13674661.htm</link>
        <pubDate>Wed, 30 Mar 2022 04:29:20 +0000</pubDate>
                <category><![CDATA[健康1+1]]></category>

页面显示

 

 

 

 

1、在XML文档中怎么使用DTD

导入方式 语法格式 说明
内部DTD
<!DOCTYPE 根元素名[
     元素描述
]>

将DTD定义放在XML文档内部,紧跟在XML声明和处理指令后面

如:<!DOCTYPE 模型列表[

     <!ELEMENT 模型列表(模型)*>

     ]>

外部DTD
<!DOCTYPE 根元素名 SYSTEM "外部DTD的URI">

将DTD单独定义在一个文件内,然后通过关键字SYSTEM导入DTD

如:<!DOCTYPE 模型列表 SYSTEM "模型列表DTD文件的相对路径或绝对路径">

公用DTD
<!DOCTYPE 根元素名 PUBLIC "DTD的标识名" "公用DTD的URI">

公用DTD,这种DTD一般是由某个权威机构指定,供特定行业或公众使用,通过关键字PUBLIC导入

如:<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

2、 DTD的结构

DTD文档本身不是XML文档,而只是为XML定义语义约束的文档,DTD文档的语法非常简单,大致有如下结构:

(1)第一行是DTD文档的声明,语法和XML的声明相同

(2)0到多个注释部分,DTD注释与XML注释语法相同

(3)0到多个<!ELEMENT...>定义,每个<!ELEMENT...>定义一个XML元素

(4)0到多个<!ATTLIST...>定义,每个<!ATTLIST...>为XML元素定义一个属性

(5)0到多个<!ENTITY...>定义,每个<!ENTITY...>定义一个实体

(6)0到多个<!NOTATION...>定义,每个<!NOTATION...>定义一个符号

其中<!ELEMENT...>、<!ATTLIST...>、<!ENTITY...>、<!NOTATION...>4个定义彼此完全独立,无须互相嵌套,下面就逐一说明这四种定义。

3、定义元素

(1)元素类型定义,Element Type Definition,简称ETD

(2) 元素类型

元素类型 定义格式 说明
任意类型 <!ELEMENT 元素名称 ANY> 元素可以是字符串,可以是空元素,也可以包含子元素
字符串值 <!ELEMENT 元素名称 (#PCDATA)> 元素值只能是字符串,不可以是空元素,也不能包含子元素
空元素 <!ELEMENT 元素名称 EMPTY>  
包含子元素   比较复杂,需要详细定义子元素之间的顺序以及子元素出现的次数等
混合类型 <!ELEMENT 元素名称 (#PCDATA|子元素1|子元素2|...)*> 指定值只能是几个确定的类型,比任意类型有更强的约束,但功能相当,应尽量使用混合类型

关于混合类型的定义,说明几点:

A:#PCDATA必须放在最前面

B:#PCDATA和各子元素之间只能用竖线(|)分隔,不要使用逗号分隔

C:不要在子元素之后使用?、*、+等表示频率的修饰符

(3)定义子元素

定义子元素的语法 说明 子元素的出现频率修饰词 说明
(子元素1,子元素2,...) 使用英文逗号定义有序的子元素 默认(没有修饰词) 出现一次,且只能出现一次
(子元素1|子元素2|...) 使用竖线定义互斥的子元素 ? 出现0或1次
((子元素1,子元素2)|(子元素3,子元素4)) 使用括号将子元素分组 + 出现1或多次
(子元素1|子元素2|...)+ 使用竖线互斥,然后使用频率修饰实现定义无序的子元素 * 出现0或多次

4、定义属性

在XML中,属性不能单独存在,因此定义属性时必须指定属于哪个元素。定义属性的语法格式如下:

<!ATTLIST 属性所属的元素名称  属性名称  属性类型  [元素对属性的约束]  [默认值]>

(1)属性类型

类型 说明
CDATA 该属性值只能是字符串数据
(en1|en2|en3) 该属性值必须是一系列枚举值之一
ID 该属性值必须是有些的标识符,且该属性值可用于标识该元素,因此必须在此XML文档中唯一
IDREF 该属性值必须是引用另一个已有的ID类型的属性值
IDREFS 该属性值必须是引用已有的一个或多个ID类型的属性值,多个ID类型的属性值之间使用空格分隔
NMTOKEN 该属性值必须是合法的XML名称,必须是字符串数据,比CDATA约束更强,只能由字母、数字、下划线、中划线,点号和冒号组成
NMTOKENS 该属性值必须是一个或多个NMTOKEN类型的属性值,多个使用空格分隔
ENTITY 该属性值是一个外部实体,比如图片
ENTITIES 该属性值是一个或多个ENTITY类型的属性值,多个使用空格分隔
NOTATION 该属性值是在DTD中声明过的符号(NOTATION),这是个将要过期的规范,尽量避免使用
xml: 该属性值是一个预定义的XML值

(2)元素对属性的约束与默认值的关系

元素对属性的约束 说明 默认值
未指定   必须指定默认值
#REQUIRED 必须的属性,必须为相应元素提供该属性 不能指定默认值
#IMPLIED 该属性可有可无 不能指定默认值
#FIXED 该属性值是固定的,定义时必须指定固定值 必须指定默认值

5、定义实体

实体引用就是用一个字符串代替另一个字符串,类似于C语言中的宏,上一篇笔记中已经提到过XML中内置的5个实体引用,在这里接着看看怎么自定义实体引用。

实体类型 使用场所 定义语法 使用语法 说明
普通实体 XML <!ENTITY 实体名 "实体值"> &实体名;  
参数实体 DTD <!ENTITY % 实体名 "实体值"> %实体名; 必须在使用前先定义
外部实体 XML <!ENTITY 实体名 SYSTEM "实体值所在文件的URI"> &实体名; 这里外部文件必须是满足XML文档结构的文本文档
公用外部实体 XML <!ENTITY 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI"> &实体名;  
外部参数实体 DTD <!ENTITY % 实体名 SYSTEM "实体值所在文件的URI"> %实体名;  
公用外部参数实体 DTD <!ENTITY % 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI"> %实体名;  
未解析实体 XML <!ENTITY % 实体名 SYSTEM "实体值所在文件的URI" NDATA 符号名> 需要通过ENTITY等类型的属性调用 未解析实体不能由XML文档解析,而需要根据相应的符号名去解析
公用未解析实体 XML <!ENTITY % 实体名 PUBLIC "公用实体标识名" "实体值所在文件的URI" NDATA 符号名>

6、定义符号

定义符号也有两种语法格式,分别定义普通符号和公用符号:

符号类型 定义语法
普通符号 <!NONATION 符号名 SYSTEM "符号值">
公用符号 <!NONATION 符号名 PUBLIC "公用符号标识名" "符号值">

符号值通常有两种形式:

(1)MIME:通用MIME类型的文件总是由相应的程序负责处理

(2)外部程序所在路径:直接指定某个外部程序负责处理XML文档中的外部数据

符号通常有两种用途:

(1)如上,符号可以用来定义未解析实体

(2)符号可以作为ENTITY或ENTITIES类型的属性值

(3)符号还可以作为NOTATION类型的属性的值,定义NOTATION类型的属性时,语法如下:

<!ATTLIST 属性所属的元素 属性名 NOTATION  (值1|值2|...) 约束 默认值>

比一般的属性定义多一个值的列表。

posted @ 2022-03-26 23:52  小林野夫  阅读(636)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/