XML DTD 简介
Posted 戴泽supp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML DTD 简介相关的知识,希望对你有一定的参考价值。
DTD 简介
一、介绍
文档类型定义(DTD)可定义合法的 XML 文档构建模块。它使用一系列合法的元素来定义文档的结构。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
为什么使用 DTD?
- 通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
- 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据
- 而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
- 您还可以使用 DTD 来验证您自身的数据。
二、内部的 DOCTYPE 声明
语法:
<!DOCTYPE root-element [element-declarations]>
示例:
<?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>
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” 类型
三、外部文档声明
语法:
<!DOCTYPE root-element SYSTEM "filename">
示例:
<?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>
note.dtd
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
四、DTD - XML 构建模块
所有的 XML 文档(以及 html 文档)均由以下简单的构建模块构成:
- 元素
- 属性
- 实体
- PCDATA
- CDATA
1、元素
元素是 XML 以及 HTML 文档的主要构建模块。如:
<body>some text</body>
<message>some text</message>
声明一个元素
<!ELEMENT element-name category>
//或
<!ELEMENT element-name (element-content)>
空元素
<!ELEMENT element-name EMPTY>
示例:
<!ELEMENT br EMPTY>
XML 示例:
<br />
只有 PCDATA 的元素
<!ELEMENT element-name (#PCDATA)>
示例:
<!ELEMENT from (#PCDATA)>
带有任何内容的元素
<!ELEMENT element-name ANY>
示例:
<!ELEMENT note ANY>
带有子元素(序列)的元素
<!ELEMENT element-name (child1)>
或
<!ELEMENT element-name (child1,child2,...)>
示例:
<!ELEMENT note (to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。“note” 元素的完整声明是:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
声明只出现一次的元素
<!ELEMENT element-name (child-name)>
示例:
<!ELEMENT note (message)>
声明最少出现一次的元素
- 加号(+)声明了:message 子元素必须在 “note” 元素内出现至少一次。
<!ELEMENT element-name (child-name+)>
示例:
<!ELEMENT note (message+)>
声明出现零次或多次的元素
- 星号(*)声明了:子元素 message 可在 “note” 元素内出现零次或多次。
<!ELEMENT element-name (child-name*)>
示例:
<!ELEMENT note (message*)>
声明出现零次或一次的元素
- 问号(?)声明了:子元素 message 可在 “note” 元素内出现零次或一次。
<!ELEMENT element-name (child-name?)>
示例:
<!ELEMENT note (message?)>
声明"非…/即…"类型的内容
- “note” 元素必须包含 “to” 元素、“from” 元素、“header” 元素,以及非 “message” 元素即 “body” 元素。
<!ELEMENT note (to,from,header,(message|body))>
声明混合型的内容
- “note” 元素可包含出现零次或多次的 PCDATA、“to”、“from”、“header” 或者 “message”。
示例:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
2、属性
属性可提供有关元素的额外信息。属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。如:
//元素的名称是 "img"。属性的名称是 "src"。属性的值是 "computer.gif"。由于元素本身为空,它被一个 " /" 关闭。
<img src="computer.gif" />
声明属性
<!ATTLIST element-name attribute-name attribute-type attribute-value>
DTD 实例:
<!ATTLIST payment type CDATA "check">
XML 实例:
<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 | 属性值是固定的 |
默认属性值
- “square” 被定义为带有 CDATA 类型的 “width” 属性的空元素。如果宽度没有被设定,其默认值为0 。
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
合法的 XML:
<square width="100" />
#REQUIRED
语法
<!ATTLIST element-name attribute-name attribute-type #REQUIRED>
示例
DTD:
<!ATTLIST person number CDATA #REQUIRED>
合法的 XML:
<person number="5677" />
非法的 XML:
<person />
#IMPLIED
语法:
<!ATTLIST element-name attribute-name attribute-type #IMPLIED>
示例:
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
合法的 XML:
<contact fax="555-667788" />
合法的 XML:
<contact />
#FIXED
语法:
<!ATTLIST element-name attribute-name attribute-type #FIXED "value">
示例:
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的 XML:
<sender company="Microsoft" />
非法的 XML:
<sender company="W3Schools" />
列举属性值
#FIXED
语法:
<!ATTLIST element-name attribute-name (en1|en2|..) default-value>
示例:
DTD:
<!ATTLIST payment type (check|cash) "cash">
XML 例子:
<payment type="check" />
或
<payment type="cash" />
3、实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。
实体引用 | 字符 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ’ |
一个内部实体声明
- 注意: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。
语法:
<!ENTITY entity-name "entity-value">
示例:
DTD 实例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">
XML 实例:
<author>&writer;©right;</author>
一个外部实体声明
- 注意: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。
语法:
<!ENTITY entity-name SYSTEM "URI/URL">
示例:
DTD 实例:
<!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd">
XML example:
<author>&writer;©right;</author>
4、PCDATA
PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &
、<
以及 >
实体来分别替换它们。
5、CDATA
CDATA 的意思是字符数据(character data)。
**CDATA 是不会被解析器解析的文本。**在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
五、DTD 验证
- 参考官网
- Java SE 中有专门的 api,可以用其来验证,参考 Java 标准类库。
以上是关于XML DTD 简介的主要内容,如果未能解决你的问题,请参考以下文章