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、实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。

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

一个内部实体声明

  • 注意: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (😉。

语法:

<!ENTITY entity-name "entity-value">

示例:

DTD 实例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright runoob.com">

XML 实例:
<author>&writer;&copyright;</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;&copyright;</author>

4、PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。

被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;&lt; 以及 &gt; 实体来分别替换它们。

5、CDATA

CDATA 的意思是字符数据(character data)。

**CDATA 是不会被解析器解析的文本。**在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

五、DTD 验证

  • 参考官网
  • Java SE 中有专门的 api,可以用其来验证,参考 Java 标准类库。

以上是关于XML DTD 简介的主要内容,如果未能解决你的问题,请参考以下文章

DTD验证XML文档

使用DTD验证XML

XML Schema 简介

DTD(文档类型定义)概述

DTD && Schema

xml约束技术---schema