-- 作者: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;©right;</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;©right;</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">
|