查看文章
 
DTD
2007-10-25 10:24

DTD(Document Type Definition)定义了XML文档的合法构造块,他用一系列合法的元素定义文档结构
DTD可以在XML文档的内部声明,也可以外部引用

为什么要用DTD呢?
使用DTD,我们每个XML文件都可以有自己的格式描述
使用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>

!DOCTYPE note 定义了这是一个note类型的文档
!ELEMENT note 定义note 有4个子元素 to,from,heading,body
!ELEMENT to 定义to 这个元素是 #PCDATA 类型的
其他类似

外部DOCTYPE 声明
语法: <!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文档,那如何验证呢?下面就用javascript验证一下
先写个错误的XML,然后用javascript检验

note_dtd_error.xml:
<?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>
<fromm>Jani</fromm>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

validate.html:
<html>
<body>
<h3>
This demonstrates a parser error:
</h3>

<script type="text/javascript">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")

document.write("<br />Error Code: ")
document.write(xmlDoc.parseError.errorCode)
document.write("<br />Error Reason: ")
document.write(xmlDoc.parseError.reason)
document.write("<br />Error Line: ")
document.write(xmlDoc.parseError.line)
</script>

</body>
</html>

运行validate.html 可以看到以下信息:

This demonstrates a parser error:

Error Code: -1072898028
Error Reason: 根据 DTD/Schema,元素内容无效。预期: from。
Error Line: 12

DTD的概貌和如何验证已经看过了,接下来看一下DTD的具体语法

2. DTD-XML 构造块

在DTD看来,XML文档都是由以下简单的改造块构成的:
Elements
Attributes
Entities
PCDATA
CDATA

Elements
Elements是主要的构造块,可以包含文本,其他元素,或者为空,如
<message>some message in between</message>  

Attributes
Attributes为Elements提供额外信息,他总是在Elements的起始标签中,总是以 name/value对 出现

Entities
Entities是用语定义通用文本的变量,Entities在XML文档被解析时被展开,下面的是XML预定义的实体:

&lt;            <  
&gt;           >  
&amp;        &  
&quot;        "  
&apos;       '  


PCDATA
PCDATA是字符数据,是会被解析的文本,文本中的tags会被当作标记处理,entities会被展开

CDATA
CDATA也是字符数据,但他是不会被解析的文本,文本中的tags不会被当作标记处理,entities也不会被展开

3. Elements

(1)声明一个Element,语法:

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

(2)Empty elements, 用关键字 EMPTY 来声明

<!ELEMENT element-name EMPTY>

example:
<!ELEMENT br EMPTY>

XML example:
<br />

(3)Elements 只包含字符数据时,用 #PCDATA    来声明

<!ELEMENT element-name (#PCDATA)>

example:
<!ELEMENT from (#PCDATA)>

(4)Elements with any contents, 用 ANY 声明时,元素可包含任何可以被解析的数据

<!ELEMENT element-name ANY>
example:
<!ELEMENT note ANY>

(5)Elements with children (sequences)

<!ELEMENT element-name
(child-element-name)>
or
<!ELEMENT element-name
(child-element-name,child-element-name,.....)>

example:
<!ELEMENT note (to,from,heading,body)>

子元素出现的顺序必须和声明时的一致,子元素也可以有子元素

(6) 声明相同元素只出现一次

<!ELEMENT element-name (child-name)>

example:
<!ELEMENT note (message)>
说明 message 在 note 中只能出现一次

(7) 声明相同元素至少出现一次

<!ELEMENT element-name (child-name+)>

example:
<!ELEMENT note (message+)>
"+"说明 message 在 note 中至少出现一次

(7) 声明相同元素出现0次或多次

<!ELEMENT element-name (child-name*)>

example:
<!ELEMENT note (message*)>
"*"说明 message 在 note 中的出现是随意的

(8) 声明相同元素出现0次或一次

<!ELEMENT element-name (child-name?)>

example:
<!ELEMENT note (message?)>
"?"说明 message 在 note 中可不出现,或者出现一次

(9) 声明 either/or 内容

example:
<!ELEMENT note (to,from,header,(message|body))>
note 必须包含一个to,一个from,一个header,和message body其中之一

(10) 声明混合内容

example:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
note 可以包含 可被解析的字符,to, from, header, message, 并且可以出现任意次

4. Attributes

(1) 声明Attributes,语法:

<!ATTLIST element-name attribute-name
attribute-type default-value>

example:
DTD example:
<!ATTLIST payment type CDATA "check">

XML example:
<payment type="check" />

attribute-type 有下列值:
CDATA      字符数据
(en1|en2|..)      值必须是枚举列表中的一个
ID      unique id
IDREF      其他元素的id
IDREFS      其他id 列表
NMTOKEN      一个有效的XML名字
NMTOKENS      有效的XML名列表
ENTITY       一个实体
ENTITIES      一个实体列表
NOTATION      一个符号名
xml:      一个预定义的XML值

default-value 有下列值:
value      默认值
#REQUIRED      这个属性必须出现
#IMPLIED      这个属性不是必须的
#FIXED value      这个属性的只是固定的


(2) 指定一个默认值属性

DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">

Valid XML:
<square width="100" />

square被定义为一个空元素,他有一个CDATA类型的属性 width,如果width没被指定值,那他就是0

(3) #IMPLIED
语法:

<!ATTLIST element-name attribute-name
attribute-type #IMPLIED>

example:
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>

Valid XML:
<contact fax="555-667788" />
Valid XML:
<contact />

(4) #REQUIRED
语法:

<!ATTLIST element-name attribute_name
attribute-type #REQUIRED>

Example
DTD:
<!ATTLIST person number CDATA #REQUIRED>

Valid XML:
<person number="5677" />

Invalid XML:
<person />

(5) #FIXED
语法:

<!ATTLIST element-name attribute-name
attribute-type #FIXED "value">

Example
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">

Valid XML:
<sender company="Microsoft" /

Invalid XML:
<sender company="W3Schools" />

(6) Enumerated attribute values

<!ATTLIST element-name
attribute-name (en1|en2|..) default-value>

DTD example:
<!ATTLIST payment type (check|cash) "cash">

XML example:
<payment type="check" />
or
<payment type="cash" />

5. Entities
Entities 是用来为普通文本定义捷径
有两种声明方式:
(1) 内部声明

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

DTD Example:

<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">

XML example:

<author>&writer;&copyright;</author>

(2) 外部声明

Syntax:

<!ENTITY entity-name SYSTEM "URI/URL">

DTD Example:

<!ENTITY writer    
SYSTEM "http://www.w3schools.com/dtd/entities.dtd">
!ENTITY copyright
SYSTEM "http://www.w3schools.com/dtd/entities.dtd">

XML example:

<author>&writer;&copyright;</author>


类别:默认分类||添加到搜藏 |分享到i贴吧|浏览(126)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu