- Document Type Definition
- DTD这个词其实在SGML就看到过了
- 其实没错,DTD本是面向SGML的
- 通常在某一领域内,其信息的交换都是遵循一定的模式的
- 所以我们就希望来约束这种信息的模式,加强信息在双方之间的可交换性
- XML本身SGML的子集,其DTD也自然可以拿来用
- 而XML用的DTD又是SGML的DTD的一个子集
XML uses a subset of SGML DTD.
——Wikipedia
- 不过这种简单省事的继承,使得DTD有太多的局限性和缺陷
- 没有采用和XML一致的语法
- 只能有一个外部DTD来约束XML
- 不支持XML的命名空间
- 缺乏足够的描述能力
- 数据类型过于简单
DTD的引用
- A Document Type Definition (DTD) defines the legal building blocks of an XML document.
- It defines the document structure with a list of legal elements and attributes.
- A DTD can be declared inline inside an XML document, or as an external reference.
——Wikipedia
内部DTD
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE student [
...
...
]>
<student>
...
...
</student>
- 这是一个XML文件,而其DTD规则是直接写在XML文件内的
- 也可以单独写一个DTD文件,而只在XML内声明与这个XML文件所匹配的DTD文件的路径。
外部DTD
- 外部DTD的好处就是,写一个DTD文件,可以为同类型的多个XML文件进行模式规定。这种模式规定其实称为验证更为准确。
- 分为私有和公开的DTD引用方法
<!DOCTYPE root_element SYSTEM "DTD_location">
- 私有DTD声明
- root_element即是本XML文档根元素的名称
- DTD_location表名DTD文件所在的URL,相对or绝对都可以
<!DOCTYPE root_element PUBLIC "DTD_name" "DTD_location">
- 公有DTD声明
- 这种 DTD 文件由由权威机构制订的、提供给特定行业或公众使用的 DTD,甚至可能通过了国际标准化组织的批准,以便数据的提供者和使用者对所交互的数据进行有效性验证
- DTD_name有语法的限制
- ”prefix//owner_of_the_DTD//description_of_the_DTD//language_identifier”
- prefix
- ISO:表示通过批准的ISO标准
- +:表示通过批准的非ISO标准
- -:表示未通过批准的非ISO标准
- owner_of_the_DTD 表示发布该文档的机构。
- description_of_the_DTD 表示对该文档的简短描述。
- description_of_the_DTD 表示对该文档的简短描述。
DTD语法
元素
<!ELEMENT element-name category>
<!ELEMENT element-name (element-content)>
- <!ELEMEMT表示元素声明的开始
- element-name为元素名。未在DTD中声明的元素名则不允许出现在其验证的XML文档中。
- category或(element-content)
- 这之后可以规定该元素的类型、或者是内容模型
类型与内容模型
<!ELEMENT element-name EMPTY>
- 空元素
<!ELEMENT element-name ANY>
- 包含任意内容的元素
<!ELEMENT element-name (#PCDATA)>
- 只包含文本,不能包含子元素
<!ELEMENT element-name (child1,child2,...)>
- 只包含子元素的元素
- (child1,child2,…)是一个序列,同时也是内容模型的一种
- 表示该元素必须包含这里面所有的子元素,且顺序一致
- 关于内容模型
- 各种符号
符号 | 含义 | 示例 |
---|---|---|
, | 分隔序列,表明顺序 | 如上 |
| | 选择前后任意一项 | (child1|child2)表示必须包含其中一个子元素 |
() | 内部作为整体 | (child1,child2)|child3表示要么包含child1和child2,要么包含child3 |
? | 表示相应的元素出现0或1次 | child1?表示出现child1元素0或1次(可有可无,有则一个) |
+ | 表示1次或多次 | child1+表示至少一个child1子元素 |
* | 表示0次或1次或多次 | child1*就随便出现几次喽 |
- 一些示例
<!ELEMENT note (to,from,header,(message|body))>
<!ELEMENT article (title, subtitle?, author*, (para | table | list)+,bibliography?)>
<!ELEMENT element-name (#PCDATA | child1 | child2 | ...)*>
- 包含指定的子元素以及文本内容的元素
属性
<!ATTLIST element-name attr-name attr-type attdesc>
- 多个属性如下
<!ATTLIST element-name attr1 attr-type1 attdesc1
attr2 attr-type2 attdesc2
>
或
<!ATTLIST element-name attr1 attr-type1 attdesc1>
<!ATTLIST element-name attr2 attr-type2 attdesc2>
- 属性类型
- CDATA:任意字符串
- (value1|value2|…):枚举
- NMTOKEN:必须是合法的XML标记
- ID:文档中唯一,必须字母或下划线开头,可以由字母、数字、下划线、横线、点号组成
- IDREF:表示引用另一个属性的ID
- ENTIT:实体
- 属性声明的描述
- value:即属性的值,缺省为value
- #REQUIRED:该属性是必须的
- #IMPLIED:是可选的
- #FIXED value:是可选的,如果有则必须为指定的value
- 示例1
<!ATTLIST memo id ID #REQUIRED
security (high|low) "high"
keywords NMTOKENS #IMPLIED
>
- 示例2
<!ELEMENT Step EMPTY>
<!ATTLIST Step id ID #REQUIRED>
<!ELEMENT StepLink EMPTY>
<!ATTLIST StepLink steps IDREFS #IMPLIED>
如果在该文档中存在:
<Step id="step1"/>
<Step id="step2"/>
则
<StepLink steps="step1 step2"/>
是正确的
实体
- 内部参数实体
- 用于在DTD规则中占位。不能用于XML文档中
- 不能包含XML文本
<?xml version="1.0" standalone="no"?>
<!DOCTYPE student [
<!-- DTD example-->
<!ENTITY % p "(#PCDATA)">
<!ELEMENT student (id,surname,firstname)>
<!ELEMENT id %p;>
<!ELEMENT surname %p;>
<!ELEMENT firstname %p;>
]>
- 外部参数实体
- 相当于向DTD文件中导入一个外部文件
语法
<!ENTITY % entity-name SYSTEM "URI">
或
<!ENTITY % entity-name PUBLIC "public_ID" "URI">
示例
<?xml version="1.0" standalone="no"?>
<!DOCTYPE student [
<!ENTITY % studentdtd SYSTEM "http://example.org/student.dtd">
%studentdtd;
]>
<!-- 相当于往XML导入了一个外部DTD -->
- 一般实体
- 用于在XML文档中占位
- 字符内容实体
- 预定义实体
- 命名实体
- 数值实体
- 未解析实体
字符内容实体
声明
<!ENTITY entity-name "entity_value">
引用
&entity-name;
示例
<?xml version="1.0" standalone="yes" ?>
<!DOCTYPE author [
<!ELEMENT author (#PCDATA)>
<!ENTITY us "You and me">
]>
<author>&us;</author>
数值实体
<title>学习XML</title>
将被解析为
<title>学习XML</title>
使用了Unicode代码
未解析实体
- 可以在 XML 数据中指明所关联的二进制文件(图片、音频、视频等等),然后由解析器通过调用适当的应用程序对这些文件进行解析
- 可以在 XML 数据中指明所关联的二进制文件(图片、音频、视频等等),然后由解析器通过调用适当的应用程序对这些文件进行解析
示例
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE img [
<!ELEMENT img EMPTY>
<!ATTLIST img src ENTITY #REQUIRED>
<!NOTATION gif SYSTEM "gif-viewer.exe">
<!ENTITY logo SYSTEM "logo.gif" NDATA gif>
]>
<img src="logo"/>