DTD 指南

英文站点在 http://www.w3schools.com/dtd/default.asp

DTD的介绍

DTD的意图在于定义XML文档的合法构建模块,它通过一系列合法元素来决定了XMl文档的内部结构。
DTD能够在你自己的XML文档内部声明,也可以作为外部来参照

1.内部声明
如果DTD被包含在XML源文件中,它将通过以下语法格式来在"DOCTYPE"中定义:
<!DOCTYPE root-element [element-declarations]>

例1:
<?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的XML文档解释如下
<!DOCTYPE note    (在第2行) 定义这是一个类型为note的文档.
<!ELEMENT note    (在第3行) 定义 note 有四个元素: "to,from,heading,body".
<!ELEMENT to        (在第3行) 定义 to 元素类型为 "#PCDATA".
<!ELEMENT from    (在第4行) 定义 from 元素类型为 "#PCDATA".
......

2.外部声明
如果DTD在XML源文件的外部,它将通过以下语法格式来在"DOCTYPE"中定义:
<!DOCTYPE root-element SYSTEM "filename">

例2:
此例XML文档与例1相同,但是使用的是外部的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>

文件note.dtd包含定义的DTD
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

看完以上大概介绍,可能大家有这样的疑问,为什么要使用DTD?
1.通过DTD,你的每个XML文件都能保存使用DTD格式化的数据描述。
2.通过DTD,独立于使用者,并使用共同DTD达到数据交换之目的。

你的应用程序可以通过标准的DTD去验证来自外界的数据是否合法,
当然你也可以通过DTD去验证自己的数据。

DTD-XML的构建模块
无论是XML还是HTML,构建模块(The building blocks)的意思就是类似象<body>....</body>这样的标签。

XML文档的构建模块
所有XML文档(包括HTML文档)都是由以下构建模块所建立

1. Elements
2. Tags
3. Attributes
4. Entities
5. PCDATA
6. CDATA

以下是上述构建模块的摘要介绍

1. Elements(元素)
元素是XML和HTML文档的主构建模块
对于HTML的元素,例如象"body"和"table",而XML的元素,例如象例1的"note"和"message"。
元素包含文本,其他的元素,或者是空元素。
空的HTML元素例如有"hr", "br"和"img"(应该说是没有结尾标签的独立元素)。
 
2. Tags(标签)
标签是被用来标记元素的
使用象<元素名>这样的开始标签来标记元素的开始,
象</元素名>这样的结束标签来标记元素的结束。

例3:
使用body标签来标记body元素。
<body>body text in between</body>
使用message标签来标记message元素。
<message>some message in between</message>

3. Attributes(属性)
属性提供了关于元素额外的信息
属性经常被内置于元素的开始标签内,并以name/value成对出现。
以下例子是一个含有关于源文件附加信息属性的img元素
例4:
<img src="computer.gif" />
上述例子元素是img,属性名是src,属性数值为computer.gif,因为img在HTML文档内为空元素,所以结尾以"/"结束,没有结束标签。

4. Entities(实体)
实体是定义共同文本的变量,实体的引用就是指引用已经定义好的实体变量。
大家或许都知道HTML文档中象"&nbsp;"这样的实体引用,它是被用于在HTML中插入一个空格,
当文档被XML解析器所解析时,实体被引用赋予事前预定义好的意义。

以下是在XML中预定义的实体
实体名称   所应用的字符
&lt;             <
&gt;            >
&amp;        &
&quot;        "
&apos;        '

5. PCDATA(被解析字符数据)
PCDATA意思是指被解析的字符数据(parsed character data)
PCDATA是会被解析器所解析的文本,其中包含在文本里的标签将会被视为标记,而实体将会被引用。

6. CDATA
CDATA意思是指字符数据(character data)
CDATA是不会被解析器所解析的文本,其中包含在文本里的标签将不会被视为标记,实体也将不会被引用。

Elements(元素)
在一个DTD中,XML元素是通过DTD的元素声明来声明的。

1. 声明一个元素
使用以下语法来使用DTD的元素声明来声明一个XML元素:
<!ELEMENT element-name category>
或者是
<!ELEMENT element-name (element-content)>

2. 空元素
空元素是通过关键字EMPTY来声明的。
语法格式为:
<!ELEMENT element-name EMPTY>

例:
<!ELEMENT br EMPTY>
在XML文档中使用为
<br />

3. 仅有字符数据的元素
使用(#PCDATA)来声明仅有字符数据的元素
语法格式为:
<!ELEMENT element-name (#PCDATA)>
例:
<!ELEMENT from (#PCDATA)>

4. 含有任意内容的元素
含有任意内容的元素是通过关键字ANY来声明的。
所谓任意内容是指能够包含任何结合的可被解析的数据。
语法格式为:
<!ELEMENT element-name ANY>
例:
<!ELEMENT note ANY>

5. 含有子元素的元素
如果包含一个或多个子元素的元素,它将通过含有括号的子元素名称来进行定义
语法格式为:
<!ELEMENT element-name
 (child-element-name)>
或者
<!ELEMENT element-name
 (child-element-name,child-element-name,.....)>

当子元素按照一定恰当分解的顺序进行声明时,那他们在文档中也必须以相同的顺序出现
在全声明中,子元素必须被全部声明,当然他们也可以有自己的子元素。

例:
以下是含有子元素的note元素的全声明
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>

6. 相同的元素只出现一次的声明
语法格式为:
<!ELEMENT element-name (child-name)>
例:
<!ELEMENT note (message)>
上述例子是指子元素message必须出现一次,并且在被包含的note元素里只出现一次。

7. 相同的元素至少出现一次的声明
语法格式为:
<!ELEMENT element-name (child-name+)>
例:
<!ELEMENT note (message+)>
例中的+是指子元素message必须在被包含的note元素里出现一次或者多次。

8. 相同的元素不出现或者多次出现的声明
语法格式为:
<!ELEMENT element-name (child-name*)>
例:
<!ELEMENT note (message*)>
例中的*是指子元素message能够在被包含的note元素里不出现或者出现多次。

9. 相同的元素不出现或者出现一次的声明
语法格式为:
<!ELEMENT element-name (child-name?)>
例:
<!ELEMENT note (message?)>
例中的?是指子元素message能够在被包含的note元素里不出现或者出现一次。

10. "或"的声明
例:
<!ELEMENT note (to,from,header,(message|body))>
上例是指note元素必须包含一个to元素,一个from元素,一个header元素,
以及一个message元素或body元素

11. 混合内容的声明
例:
<!ELEMENT note (#PCDATA|to|from|header|message)*>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值