DTD -- XML验证

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

DTD简介

内部的 DOCTYPE 声明

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

<?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 类型的文档。

!ELstrongENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"

!ELstrongENT to (第四行)定义 to 元素为 "#PCDATA" 类型

!ELstrongENT from (第五行)定义 frome 元素为 "#PCDATA" 类型

!ELstrongENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型

!ELstrongENT body (第七行)定义 body 元素为 "#PCDATA" 类型

外部文档声明

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

<!DOCTYPE root-element SYSTEM "filename">

以下是 XML 文档,这个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,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

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

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

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

DTD - XML 构建模块

XML 文档构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

Elements :元素

Attributes :属性

Entities :实体

PCDATA :

  意思是被解析的字符数据(parsed character data)。

  可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

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

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

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

CDATA :

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

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

DTD - 元素

在一个 DTD 中,元素通过元素声明来进行声明。

声明一个元素

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:

<!ELEMENT element-name category><!ELEMENT element-name (element-content)>

空元素

空元素通过类别关键词EMPTY进行声明:

<!ELEMENT element-name EMPTY>

实例:

<!ELEMENT br EMPTY>

XML example:

<br />

只有 PCDATA 的元素

只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

<!ELEMENT element-name (#PCDATA)>

实例:

<!ELEMENT from (#PCDATA)>

带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!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?)>

上面的例子中的问号(?)声明了:子元素 message 可在 "note" 元素内出现零次或一次。

声明"非.../既..."类型的内容

实例:

<!ELEMENT note (to,from,header,(message|body))>

上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。

声明混合型的内容

实例:

<!ELEMENT note (#PCDATA|to|from|header|message)*>

上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

DTD - 属性

DTD - 实体

原文地址:https://www.cnblogs.com/hf8051/p/4846432.html