以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  Document Type Definition  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=49118)


--  作者:chendx
--  发布时间:6/28/2007 12:08:00 AM

--  Document Type Definition
目录
DTD综述: 2
DTD的引入: 3
DTD中定义XML元素: 4
DTD中定义XML属性: 6
DTD中定义XML的实体: 8


DTD综述:
DTD就是Document Type Definition的缩写,它主要对与之相关联的XML文档中的元素、属性、实体、记号进行定义,以确保关联的文档在修改时能够维持文档结构和内容的合法性。但是XML Schema与DTD的作用是一样的,更为可观的是,XML Schema能够提供对数据类型和名词空间的支持。所以,在不久的将来,DTD应该会被XML Schema所取代。就我个人对DTD的使用感觉而言,这并非一个很好的XML结构观察工具,因为DTD对XML中的各个部分的定义显得松散而凌乱,完全没有学到XML的层次感,并不适合用于非常复杂的XML文档。

DTD的引入:
一个DTD文档可以定义在与之相关的XML文档的内部也可以作为一个单独的文件被一个或是多个XML文档所关联:
1. 引入内部DTD:
<?xml version="1.0"  encoding=”UTF-8” standalone=”Yes”?>
<!DOCTYPE note [   //DOCTYPE后空格接该XML的根节点
  <!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>

2. 引入外部DTD:
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">  //SYSTEM是关键字,还有PUBLIC
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
概念:DTD是Document Type Definition 的缩写,它定义了与之相关的XML文档所有合法的元素和属性。



DTD中定义XML元素:
DTD中一共可以把元素分为五种类型:
1. 空元素
<!ELEMENT element-name EMPTY>
Example:
<!ELEMENT br EMPTY>
XML example:
<br />

2. 已解析的字符内容的元素
<!ELEMENT element-name (#PCDATA)>
Example:
<!ELEMENT from (#PCDATA)>

3. 任意内容的元素
<!ELEMENT element-name ANY>
Example:
<!ELEMENT note ANY>

4. 内容为子元素的元素
<!ELEMENT element-name (child1,child2,...)>
Example:
<!ELEMENT note (to,from,heading,body)>
注意:子元素必须按其在父元素中出现的顺序依次出现

4.1  每个子元素出且仅出现一次:
<!ELEMENT element-name (child1,child2,...)>
Example:
<!ELEMENT note (to,from,heading,body)>

4.2  每个子元素至少出现一次:
<!ELEMENT element-name (child1+,child2+,...)>
Example:
<!ELEMENT note (to+,from+,heading+,body+)>

4.3  每个子元素可以出现任意次(包括不出现):
<!ELEMENT element-name (child1*,child2*,...)>
Example:
<!ELEMENT note (to*,from*,heading*,body*)>

4.4  只可能不出现或是出现一次的元素:
<!ELEMENT element-name (child1?,child2?,...)>
Example:
<!ELEMENT note (to?,from?,heading?,body?)>

4.5  不可同时出现的子元素:
<!ELEMENT element-name (child1 | child2 | ,...)>
Example:
<!ELEMENT note (to,from,(heading | body))>

5. 混合内容的元素
Example:
<!ELEMENT note (#PCDATA|to|from|header|message)*>


DTD中定义XML属性:
通用的语法格式:
<!ATTLIST element-name attribute-name attribute-type default-value>
DTD example:
<!ATTLIST payment type CDATA "check">
XML example:
<payment type="check" />

属性的类型(attribute-type)有如下几种:
Type Description
CDATA 字符串值,如 “check”
(en1|en2|..) 只能从en1到enn中任选一值
ID ID类型的属性是全局唯一的
IDREF 它的取值必须是前面已经出现过的ID值
IDREFS 它的取值必须是前面已经出现过的ID值们,用空格分隔
NMTOKEN The value is a valid XML name
NMTOKENS The value is a list of valid XML names
ENTITY The value is an entity
ENTITIES The value is a list of entities
NOTATION The value is a name of a notation
xml: The value is a predefined xml value

属性自身的属性(default-value):
Value Explanation Example
Default Value 属性的默认值 DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
Valid XML:
<square width="100" />
#REQUIRED 属性必须在XML文档中出现 DTD:
<!ATTLIST person number CDATA #REQUIRED>
Valid XML:
<person number="5677" />
Invalid XML:
<person />
#IMPLIED 属性可以不在XML文档中出现 DTD:
<!ATTLIST contact fax CDATA  #IMPLIED>
Valid XML:
<contact fax="555-667788" />
Valid XML:
<contact />

#FIXED value 属性的值固定了 DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
Valid XML:
<sender company="Microsoft" />
Invalid XML:
<sender company="W3Schools" />


DTD中定义XML的实体:
实体可以分为一般实体和参数实体,而一般实体又可以分为内部实体和外部实体:
1. 一般实体
1.1 内部实体
定义的语法:<!ENTITY entity-name "entity-value">
DTD Example:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
XML example:
<author>&writer;&copyright;</author>

1.2 外部实体
定义的语法:<!ENTITY entity-name SYSTEM "URI/URL">
DTD Example:
<!ENTITY writer SYSTEM "http://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/entities.dtd">
XML example:
<author>&writer;&copyright;</author>
外部已分析实体的写法:
<?xml  version=”1.0” encoding=”TF-8”>
entity-value
注意,version属性是可选的,没有standalone的属性,只有entity-value的内容才会用来替换。

2. 参数实体
参数实体不能在XML文档中出现,只能在单独的DTD文档中被定义和使用(部的DTD不能定义和使用)。它能出现在所有tag出现的同阶位置,而且在DTD中以% y-name;的形式被引用。
定义的语法:<!ENTITY  % y-name "entity-value">


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
47.852ms