XML之DTD约束
一 DTD约束的基础知识
1 什么是DTD约束?
DTD即是文档类型定义,可定义合法的XML文档构建模块,它使用一系列合法的元素来定义文档的结构。
2 内部的 DOCTYPE 声明
假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:
<!DOCTYPE 根元素 [元素声明]>
3 外部文档声明
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM "文件名">
4 使用DTD约束的优点
- 通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述。
- 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
- 而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
- 您还可以使用 DTD 来验证您自身的数据。
5 XML 文档构建模块
所有的 XML 文档均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA
- CDATA
6 PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符。
7 CDATA
CDATA 的意思是字符数据(character data),是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
二 DTD元素
1 声明一个元素
<!ELEMENT 元素名称 类别>
<!ELEMENT 元素名称 (元素内容)>
2 空元素
<!ELEMENT 元素名称 EMPTY>
3 只有 PCDATA 的元素
<!ELEMENT 元素名称 (#PCDATA)>
4 带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:
<!ELEMENT 元素名称 ANY>
5 带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
<!ELEMENT 元素名称 (子元素名称 1)>
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。下面是一个例子:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
6 声明只出现一次的元素
<!ELEMENT 元素名称 (子元素名称)>
以下例子说明了message 子元素必须出现一次,并且必须只在 “note” 元素中出现一次
<!ELEMENT note (message)>
7 声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>
8 声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称*)>
9 声明出现零次或一次的元素
<!ELEMENT 元素名称 (子元素名称?)>
10 声明“非…/既…”类型的内容
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:“note” 元素必须包含 “to” 元素、“from” 元素、“header” 元素,以及非 “message” 元素既 “body” 元素。
三 DTD属性
1 在 DTD 中,属性通过 ATTLIST 声明来进行声明。
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
2 以下是属性类型的选项:
类型 | 描述 |
---|---|
CDATA | 值为字符数据 (character data) |
ID | 值为唯一的 id |
IDREF | 值为另外一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为合法的 XML 名称 |
NMTOKENS | 值为合法的 XML 名称的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是符号的名称 |
xml: | 值是一个预定义的 XML 值 |
3 默认值参数可使用下列值:
值 | 属性的默认值 |
---|---|
#REQUIRED | 属性值是必需的 |
#IMPLIED | 属性不是必需的 |
#FIXED value | 属性值是固定的 |
四 DTD实体
1 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。
2 内部实体声明
语法:
<!ENTITY 实体名称 "实体的值">
DTD 例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
XML 例子:
<author>&writer;©right;</author>
注意:一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 。
3 外部实体声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子:
<author>&writer;©right;</author>
五 一个简单的DTD例子
例子来源 http://www.w3school.com.cn/dtd/dtd_examples.asp
<!DOCTYPE CATALOG [
<!ENTITY AUTHOR "John Doe">
<!ENTITY COMPANY "JD Power Tools, Inc.">
<!ENTITY EMAIL "[email protected]">
<!ELEMENT CATALOG (PRODUCT+)>
<!ELEMENT PRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLIST PRODUCT
NAME CDATA #IMPLIED
CATEGORY (HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA #IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago"
INVENTORY (InStock|Backordered|Discontinued) "InStock">
<!ELEMENT SPECIFICATIONS (#PCDATA)>
<!ATTLIST SPECIFICATIONS
WEIGHT CDATA #IMPLIED
POWER CDATA #IMPLIED>
<!ELEMENT OPTIONS (#PCDATA)>
<!ATTLIST OPTIONS
FINISH (Metal|Polished|Matte) "Matte"
ADAPTER (Included|Optional|NotApplicable) "Included"
CASE (HardShell|Soft|NotApplicable) "HardShell">
<!ELEMENT PRICE (#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA #IMPLIED
WHOLESALE CDATA #IMPLIED
STREET CDATA #IMPLIED
SHIPPING CDATA #IMPLIED>
<!ELEMENT NOTES (#PCDATA)>
]>
上一篇: xml文档约束(dtd)