DTD(Document Type Definition)
1. XML基础
XML的字符被设计为使用UNICODE编码,以适应全球用户。XML文档的默认编码为UTF-8,欲改变XML的字符编码,可以使用encoding属性。
文档声明
- <? xml version = "1.0" encoding = "utf-8" standalone = "yes|no" ?>
说明:encoding指明了稳定内容的编码方式,默认为ISO-8859-1
在通过浏览器打开XML文件时,默认会将字符以UNICODE编码方式显示。
standalone要在encoding后面。
standalone标识该xml文件是否为独立的,不需要dtd来验证,默认值为“yes”。
转义字符
特殊字符 | 替代符号 |
& | & |
< | < |
> | > |
" | " |
' | ' |
处理指令是Processing Instruction的中文翻译,通常简称PI,用来为处理XML文档的应用程序提供提示信息。处理指令以<?作为开头,以?>作为结尾。
<?xml-stylesheet type="text/css" href="mystyles.css"?>
文档注释为:<!-- -->
2. DTD基础
DTD 是一套关于标记符的语法规则,是XML1.0版规格的一部分,是XML文件的验证机制,属于XML文件的组成部分。
DTD 是一种保证XML文档格式正确的有效方法,可以通过比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。
XML文件提供应用程序一个数据交换的格式,DTD正是让XML文件能够成为数据交换的标准,因为不同的公司只需定义好标准的DTD,各公司都能够依照 DTD建立XML文件,并且进行验证,如此就可以轻易的建立标准和交换数据,这样满足了网络共享和数据交互。
DTD文件是一个ASCII的文本文件,后缀名为.dtd。
dtd文件的语法格式:
- <!ELEMENT 元素名称 使用规则 >
例如:对于book.xml提供book.dtd
- <? xml version = "1.0" encoding = "utf-8" ?>
- < books >
- < book >
- < author > lclcr </ author >
- < name > JSP 编程基础 </ name >
- < price > 34.5 </ price >
- </ book >
- < book >
- < author > lclcr </ author >
- < name > java 编程基础 </ name >
- < price > 67.5 </ price >
- </ book >
- < books >
可以使用如下dtd文件来定义它
- <!ELEMENT books (book+) >
- <!ELEMENT book (author,name,price)>
- <!ELEMENT author (#PCDATA)>
- <!ELEMENT name (#PCDATA)>
- <!ELEMENT price (#PCDATA)>
说明:DTD文件本身应该使用UTF-8或Unicode编码。如果DTD文件中的内容全部为英文字符,它们本身就符号UTF-8编码,不需要进行特殊的转换;如果DTD文件中的文本内容包含中文字符,则需要将它们强制转换成UTF-8编码后保存。
3. XML中使用DTD
XML文档通过使用DOCTYPE声明语句来指明它所遵循的DTD文件。
DOCTYPE声明语句紧跟在XML文档声明语句后面,有两种形式:
- <!DOCTYPE 文档类型名称 SYSTEM "DTD文件的URL" >
- <!DOCTYPE 文档类型名称 PUBLIC "DTD名称" "DTD文件的URL">
关于DOCTYPE声明语句的说明:
文档类型名称 | XML的编写者自己定义 | 通用的习惯为:使用根元素名作为文档类型名称 |
第一种格式 | SYSTEM | 本地或组织内部所编写和使用的DTD文件 |
DTD文件的URL | dtd的相对或绝对路径 | |
第二种格式 | PUBLIC | 由权威机构制定的、公开提供给特定行业或公众使用的DTD文件 |
DTD名称 | 指定该DTD文件的标识名称,需要用引号括起来 例如:"-//Sun Microsystems Inc.//DTD Wep app2.3//EN" (1).DTD名称应符合一些标准的规定 ISO标准的DTD以“ISO”三个字母开头 被改进的非ISO标准的DTD以加号“+”开头 未被改进的非ISO标准的DTD以减号“-”开头 (2).//之后(Sun Microsystems Inc.)为DTD所有者的名称 (3).//之后(DTD Wep app2.3)为DTD所描述的文件的说明 (4).最后在//之后的为语言的种类 | |
DTD文件的URL | DTD的相对或绝对路径 |
还可以在XML中直接包含DOCTYPE声明语句来使用dtd的约束
- <? xml version = "1.0" encoding = "utf-8" standalone = "yes" ?>
- <!DOCTYPE 根元素名 [
- DTD定义语句
- ]>
4. DTD语法细节
定义元素
- <!ELEMENT 元素名称 使用规则 >
使用规则说明
规则形式 | 规则说明 |
#PCDATA | 普通文本字符串 如:<!ELEMENT author (#PCDATA)> |
EMPTY | 不包含任何子元素和文本字符串 如:<!ELEMENT author EMPTY> <author/> |
ANY | 任意类型(子元素、文本字符串或它们的组合) |
以空格分割的元素 | <!ELEMENT book (author name price)> 表示三个子元素出现的顺序无特殊要求 |
以逗号分隔的元素 | <!ELEMENT book (author,name,price)> 表示出现顺序必须与排列顺序一致 |
以竖杠分割的元素 | <!ELEMENT book (autho|name|price) 表示只能出现元素中的一个 |
正则表达式 | + : 出现一次或多次 ? : 出现零次或一次 * : 出现零次或多次 无: 必须且只能出现一次 |
定义属性
- <!ATTLIST 元素名
- 属性名1 属性类型 设置说明
- 属性名2 属性类型 设置说明
- .......
- >
属性类型包括
类型 | 说明 |
CDATA | 普通文本,若属性设置值中有特殊字符需要转义(&为&) 例如: <!ATTLIST author age CDATA #IMPLIED > |
ENUMERATED | 枚举类型 例如: <!ATTLIST 肉 品种 (鸡肉 | 牛肉 | 羊肉 | 鱼肉) "鸡肉" > |
ID | 通过该属性唯一标识一个元素 <!ATTLIST 联系人 编号 ID #REQUIRED > |
IDREF IDREFS | 属性值为同一个XML文档中另一个元素的ID属性的设置值 <!ATTLIST 联系人 编号 ID #REQUIRED 上司 IDREF #IMPLIED > 则在xml文件中上司IDREF的值应为ID属性的设置值 IDREFS则表示可以引用多个ID的设置值,中间用逗号隔开 |
NMTOKEN NMTOKENS | NAME TOKEN即名称记号,值为合法的 XML 名称 NMTOKENS可以使用多个名称记号,用空格分隔 |
NOTATION | <!NOTATION 符号名 SYSTEM "MIME类型"> <!-- 指定数据的MIME类型 --> <!NOTATION 符号名 SYSTEM "URL路径名"> <!-- 指定处理程序的URL路径 --> 例如: <!NOTATION mp SYSTEM "mplyayer.exe"> <!NOTATION gif SYSTEM "Image/gif"> <!ATTLIST 电影 演示设备 NOTATION (mp | gif) #REQUIRED > |
ENTITY ENTITYS | 使用关键字ENTITY作为属性的类型时,表明其属性值必须为在DTD中使用 <!ENTITY ...>语句定义的一个实体的引用。 只有引用实体才可以作为ENTITY类型的属性的设置值,参数实体不能用 作ENTITY类型的属性的设置值。 ENTITYS关键字用于表示一种列表类型,一个元素的ENTITYS类型的属 性设置值可以是多个实体的引用,每个实体的引用用空格分割。 |
设置说明包括:#REQUIRED、#IMPLIED、#FIXED "value"、"默认值"。
例如:
- <!ATTLIST author
- age CDATA #IMPLIED
- email CDATA #REQUIRED
- title CDATA #FIXED "页面作者"
- interest CDATA "上网"
- >
定义实体
引用实体
- <!ENTITY 实体名称 "实体内容" >
- <!ENTITY 实体名称 SYSTEM "外部XML文档的URL">
引用实体主要在XML文档中被使用,引用方式为:&实体名称;
参数实体
- <!ENTITY % 实体名称 "实体内容" >
参数实体的因为方式为:%实体名称;