1.DTD基本介绍,基本结构
2.DTD内部、外部形式
3.DTD对元素声明
4.DTD对属性声明
5.DTD的实体
6.练习
7.补充之属性类型
8.补充之条件语句
DTD是Document Type Definition (文档类型定义)的缩写。DTD指定XML文档必须遵守一系列规则。
2.DTD分为外部DTD和内部DTD两种:
1)使用内部DTD格式:
<!DOCTYPE 根元素名称 [
<!ELEMENT 子元素名称 (#PCDATA) >
]>
2)引用外部DTD格式:
<?xml version="1.0" encoding="gb2312">
<!DOCTYPE 根元素名称 SYSTEM “outDtd.dtd”>
<根元素名称>
...
</根元素名称>
---------------
引用外部DTD时,要在DOCTYPE中使用关键词SYSTEM或PUBLIC ,后者是已经被认可的文件。
通常引用自己写的dtd文件使用SYSTEM关键词
---------------
*************************************************************************************************************************
3.DTD对元素声明
<!ELEMENT 元素名 元素内容 >
ELEMENT 关键字,表示对元素类型进行声明
元素名 为当前指定元素名称
元素内容可分为:EMPTY、子元素型、混合型、ANY和#PCDATA 5种
元素内容类型:
1)EMPTY 该元素只可能有属性而不会有元素内容。
<!ELEMENT element-name EMPTY>
实例:
<br/>
2)ANY 可以包含DTD中定义的其他任何元素或已编译的字符数据,包括PCDATA、元素或元素与PCDATA的混合内容。
<!ELEMENT element-name ANY >
3)#PCDATA 不包含其他子元素而只能有文本数据,文本数据可以是普通字符、CDATA段中的内容、字符引用和实体引用。
<!ELEMENT element-name (#PCDATA) >
4)子元素型 分为3种:序列:<!ELEMENT 根元素名称(a,b,c,d ..)> , 选择<!ELEMENT 根元素名称 (a|b|c|d..) > 混合<!ELEMENT 根元素名称((a|b),(c|d))>
5)混合型 既可以包含子元素又可以包含文本数据<!ELEMENT 根元素名 (#PCDATA | 子元素)* >
?字符:它说明元素可以出现0次或1次。
* 字符:它说明元素可以不出现,或出现1次或多次。
+ 字符:它说明元素必须出现至少一次,或者说可以出现一到多次
如:<!ELEMENT 根元素名称(a+,b?,c*,d ..)>
*************************************************************************************************************************
4.DTD对属性声明
<!ATTLIST 元素名 属性名 属性类型 属性限定条件>
---------------------------------------------------------
属性类型(常见):
CDATA 字符数据,即没有标记的文本
枚举 备选属性值的值列表
ID 该属性在文档中具有唯一性
IDREF 文档中元素的ID类型属性的值
IDREFS 由空格分隔的元素的多个ID
ENTITY 在DTD中声明的实体名称
ENTITIES 在DTD中声明的由空格分隔的多个实体的名称
NMTOKEN XML名称记号
NMTOKENS 由空格份额表格的多个XML名称记号
NOTATION 在DTD中声明的记法的名称
----------------------------------------------------------
属性限定条件(常见):
#REQUIRED 元素的每个实例必须具有该属性
#IMPLIED 元素实例不必包含该属性
#FIXED+固定值 属性值被指定为固定值,且用户不能改变
默认值 如果元素中不包含该属性的属性值,那么默认值将作为属性值
-------------------------------------------------------------
*************************************************************************************************************************
5.实体声明与引用
实体分为以下几种
1.普通实体与参数实体
1)普通实体:
<!ENTITY name "text" >
name:实体引用的名称
"text":实体的内容
引用方式:&name;
<p>&name;</p>
2)参数实体:
<!ENTITY % name "text" >
text为参数实体内容,其中不能包含如:>,<,&,',",等特殊字符,这些字符的使用可以用特有的字替代
引用方式为 : %name;
2.内部实体与外部实体
内部实体如上,,
外部实体:
<!ENTITY name PUBLIC FRI "URI" >
PUBLIC格式:实体内容是被某一个领域所认可的文件
SYSTEM:通常自己写的用这个
FRI:Formal Public Identifier 为正式公用标识符,全球唯一
6.练习
- 为一个汽车的列表创建一个DTD,每一个car有子元素make、model、year、color、engine、number_of_doors、transmission_type和accessories。 元素engine有子元素number_of_cylinders和fuel_system(其值有两种carbureted和fuel-injected)。 元素accessories有属性radio、air_conditioning、power_windows、power_steering和power_brakes,以上属性均是必须的,且值为yes和no。 将现在流行汽车的名字声明为实体。 注意:上述有的条件限制用 DTD 无法实现,DTD跳过即可,需用第三题的 Schema 技术。
- 创建一个至少包含3个题目1中car元素实例的XML文档。用练习1中的 DTD 来处理该文档,验证有效性。
1.根据题目创建DTD
2.验证所写dtd方法一:利用myeclipse(eclipse) 添加该dtd,让其自动生成模板,查看生成的模板是否符合要求
如何添加xml dtd或者xml schema 可以参考http://jingyan.baidu.com/article/e9fb46e19da1117521f766d3.html
2.验证所写dtd方法二:http://www.w3school.com.cn/xml/xml_validator.asp 处检验
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE cars SYSTEM "http://home//cqx//tmp/hw01.dtd" >
<cars>
<car>
<make>make</make>
<model>&model1;</model>
<year>year</year>
<color>color</color>
<engine fuel_system="carbureted" number_of_cylinders="">engine</engine>
<number_of_doors>number_of_doors</number_of_doors>
<transmission_type>transmission_type</transmission_type>
<accessories air_conditioning="yes" power_steering="yes" power_windows="yes" radio="yes">accessories</accessories>
</car>
<car>
<make>第一制造商</make>
<model>&model01;</model>
<year>2011</year>
<color>红</color>
<engine number_of_cylinders="XX" >第一个engine</engine>
<number_of_doors>4</number_of_doors>
<transmission_type>第一个transmission_type</transmission_type>
<accessories radio="yes" air_conditioning="yes" power_windows="yes"
power_steering="yes" power_brakes="yes" >
</accessories>
</car>
<car>
<make>第二制造商</make>
<model>&model02;</model>
<year>2012</year>
<color>橙色</color>
<engine number_of_cylinders="XX" fuel_system="carbureted">第二个engine</engine>
<number_of_doors>4</number_of_doors>
<transmission_type>第二个transmission_type</transmission_type>
<accessories radio="yes" air_conditioning="yes" power_windows="yes"
power_steering="yes" power_brakes="yes" >
</accessories>
</car>
<car>
<make>第三制造商</make>
<model>&model03;</model>
<year>2013</year>
<color>黄</color>
<engine number_of_cylinders="XX" fuel_system="carbureted">第三个engine</engine>
<number_of_doors>4</number_of_doors>
<transmission_type>第三个transmission_type</transmission_type>
<accessories radio="yes" air_conditioning="yes" power_windows="yes"
power_steering="yes" power_brakes="yes" >
</accessories>
</car>
</cars>
<!ELEMENT cars (car+) >
<!ELEMENT car (make,model,year,color,engine,number_of_doors,transmission_type,accessories) >
<!ELEMENT engine (#PCDATA) >
<!ELEMENT make (#PCDATA) >
<!ELEMENT model (#PCDATA) >
<!ELEMENT year (#PCDATA) >
<!ELEMENT color (#PCDATA) >
<!ELEMENT number_of_doors (#PCDATA) >
<!ELEMENT transmission_type (#PCDATA) >
<!ELEMENT accessories (#PCDATA) >
<!ATTLIST engine number_of_cylinders CDATA #REQUIRED >
<!ATTLIST engine fuel_system ( carbureted | fuel-injected) #REQUIRED>
<!ATTLIST accessories radio (yes | no ) #REQUIRED >
<!ATTLIST accessories air_conditioning ( yes | no ) #REQUIRED >
<!ATTLIST accessories power_windows (yes | no ) #REQUIRED >
<!ATTLIST accessories power_steering ( yes | no ) #REQUIRED >
<!ATTLIST accessories power_brakes ("yes" | "no" ) #REQUIRED >
<!ENTITY model01 "STR1" >
<!ENTITY model02 "STR2" >
<!ENTITY model03 "STR3" >
7.补充之属性类型
10).NOTATION类型
XML 文档中引入了外部不可解析的实体后,解析器无法解析这些二进制文件,这时,就可以使用NOTATION类型的属性为这些二进制文件指定与其对应的应用软件以对其进行处理。
<!NOTATION gif SYSTEM “image/gif”>
<!NOTATION jpg SYSTEM “image/jpg”>
<!NOTATION png SYSTEM “c://pic.exe”>
<!ELEMENT img EMPTY>
<!ATTLIST img type NOTATION #REQUIRED>
<img type=“gif”>
8.补充之条件语句
当创建DTD和XML文档时,有时会需要注释某些没有在XML文档中声明的DTD部分。使用注释是一种方法,还可以通过IGNORE指令封装某部分DTD的声明。
<!ENTITY % ignore "IGNORE">
<!ENTITY % include "INCLUDE">
<![%ignore;[
<!ELEMENT 图书馆A (科技类,文艺类,社科类)>
]]>
<![%include;[
<!ELEMENT 图书馆B (科技类,社科类,少儿类)>
]]>
<!ELEMENT 科技类 (#PCDATA) >
<!ELEMENT 文艺类 (#PCDATA) >
<!ELEMENT 社科类 (#PCDATA) >
<!ELEMENT 少儿类 (#PCDATA) >