XML文件中的DTD是什么

常用的约束技术:XML DTD


DTD约束快速入门
    DTD(Document Type Definition),全称为文档类型定义。
   book.xml
[html] view plain copy
  1. <span style="font-size:18px;"><?xml version="1.0" ?>  
  2. <!DOCTYPE书架  SYSTEM "book.dtd">  
  3. <书架>  
  4.     <>  
  5.         <书名>葵花宝典</书名>  
  6.         <作者>东方不败</作者>  
  7.         <售价>59.00元</售价>  
  8.     </>  
  9.     <>  
  10.         <书名>九阳神功</书名>  
  11.         <作者>张无忌</作者>  
  12.         <售价>57.00元</售价>  
  13.     </>  
  14. </书架>  
  15. </span>  
   book.dtd
[html] view plain copy
  1. <span style="font-size:18px;"><!ELEMENT 书架 (书+)>  
  2.     <!ELEMENT 书 (书名,作者,售价)>  
  3.     <!ELEMENT 书名 (#PCDATA)>  
  4.     <!ELEMENT 作者 (#PCDATA)>  
  5.     <!ELEMENT 售价 (#PCDATA)>  
  6. </span>  
复杂标签:<!ELEMENT 标签名 (子节点)>
简单标签:<!ELEMENT 标签名 (#PCDATA)>
引入DTD:<!DOCTYPE 根节点 SYSTEM  "dtd的地址">

 (4)将DTD与XML文档关联的三种形式
   DTD约束既可以作为一个单独的文件编写,也可以在XML文件内编写。
  • 使用内部DTD 。<!DOCTYPE 根节点  [DTD的代码]>
  • 使用外部DTD。<!DOCTYPE 根节点 "DTD的地址">
  • 使用网络DTD。<!DOCTYPE 根节点 PUBLIC  "DTD的名称"  "DTD的地址">
      常见的使用网络DTD约束有Struts2的框架。
  在XML文件内编写DTD
[html] view plain copy
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" standalone="yes"?>  
  2. <!DOCTYPE 书架 [  
  3.     <!ELEMENT 书架 (书+)>  
  4.     <!ELEMENT 书 (书名,作者,售价)>  
  5.     <!ELEMENT 书名 (#PCDATA)>  
  6.     <!ELEMENT 作者 (#PCDATA)>  
  7.     <!ELEMENT 售价 (#PCDATA)>  
  8. ]>  
  9. <书架>  
  10.     <>  
  11.         <书名>Java就业培训教程</书名>  
  12.         <作者>张孝祥</作者>  
  13.         <售价>39.00元</售价>  
  14.     </>  
  15.     ...  
  16. </书架>  
  17. </span>  
XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种形式:
当引用的DTD文档在本地时,采用如下方式:
<!DOCTYPE 根元素 SYSTEM “DTD文档路径”>
如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
当引用的DTD文档在公共网络上时,采用如下方式:
<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>
如:<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

DTD约束语法细节

(1)DTD-定义元素
在DTD文档中使用ELEMENT关键字来声明一个XML元素。
语法:<!ELEMENT 元素名称  使用规则>
使用规则:
  • (#PCDATA)指示元素的主题内容只能是普通的文本。
  • EMPTY:用于指示元素的主体为空。比如<br/>
  • ANY:用于指示元素的主题内容为任意类型。
  • (子元素):指示元素中包含的子元素。
定义子元素及描述它们的关系:
  1) 如果子元素用逗号隔开,必须按照声明顺序去编写XML文档。
     例如:<!ELEMENT FILE(TITLE, AUTHOR, EMAIL)>
  2)如果子元素用"|" 分开,说明任选其一。
     例如:<!ELEMENT FILE(TITLE|AUTHOR|EMAIL)>
  3)用+、*、? 来表示元素出现的次数。
     如果元素后面没有+*?表示必须且只能出现一次。
     +:表示至少出现一次,一次或多次。
     *:表示可有可无,零次、一次或多次。
     ?:表示可以有也可以无,有的话只能出现一次。零次或一次。
    如:<!ELEMENT MYTITLE((TITLE*,AUTHOR?,EMAIL))*|COMMIT> 
(2)元素内容的类型

XML文件中的DTD是什么
(3)元素ELEMENT定义
XML文件中的DTD是什么

DTD属性(ATTLIST)定义

<!ATTLIST 元素名称
    属性名 属性类型  约束
    属性名 属性类型  约束
    ......
>
属性声明举例:
<!ATTLIST 商品
 类别 CDATA  #REQUIRED  必须的
 颜色 CDATA  #IMPLIED       可选的
>
对应的XML为:<商品 类别="服装" 颜色="黄色" />

属性值类型:
  • CDATA:表示属性的取值为普通的文本字符串。
  • ENUMERATED(DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
  • ID:表示属性的取值不能重复(不能只写数字)
设置说明:
  • #REQUIRED:表示该属性必须出现
  • #IMPLIED:表示该属性可有可无。
  • #FIXED:表示该属性的取值为一个固定值。语法:#FIXED "固定值"
  • 直接值:表示属性的取值为默认值。
约束的四种形式:
XML文件中的DTD是什么
DTD 定义属性示例一:
<!ATTLIST 页面作者
   姓名   CDATA    #IMPLIED
   年龄   CDATA    #IMPLIED
   联系信息  CDATA  #REQUIRED
   网站职务  CDATA  #FIXED  "页面作者"
   个人爱好  CDATA  "上网"
>
DTD 定义属性示例二:
属性的类型可以是一组取值的列表,在XML文件中设置的属性值只能是这个列表中的某个值(枚举)
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]> 
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
DTD 定义属性示例三:
ID属性的值只能由字母,下划线开始,不能出现空白字符。表示属性的设置值是一个唯一值。
[html] view plain copy
  1. <span style="font-size:18px;"><?xml version = "1.0" encoding="GB2312" ?>  
  2.   
  3. <!DOCTYPE 联系人列表[  
  4.     <!ELEMENT 联系人列表 ANY>  
  5.     <!ELEMENT 联系人(姓名,EMAIL)>  
  6.     <!ELEMENT 姓名(#PCDATA)>  
  7.     <!ELEMENT EMAIL(#PCDATA)>  
  8.     <!ATTLIST 联系人 编号 ID #REQUIRED>  
  9. ]>  
  10.   
  11. <联系人列表>  
  12.     <联系人 编号=“p1">  
  13.         <姓名>张三</姓名>  
  14.         <EMAIL>[email protected]</EMAIL>  
  15.      </联系人>  
  16.     <联系人 编号=“p2">  
  17.         <姓名>李四</姓名>  
  18.         <EMAIL>[email protected]</EMAIL>  
  19.     </联系人>  
  20. </联系人列表></span>  

实体的引入

实体定义:

  • 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
  • 在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
  • <!ENTITY 别名 “值”>
  • 在元素中引用  &别名;
定义引用实体:
  • 概念:在DTD中定义,在XML中使用
  • 语法:<!ENTITY 实体名称 “实体内容”>
  • 引用方式(注意是在XML中使用):&实体名称;
DTD中定义:
<!ENTITY copyright “版权所有”>
XML中引用:
&copyright;


综合实例如下:
[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE TVSCHEDULE [  
  3.     <!ELEMENT TVSCHEDULE (CHANNEL+)>  
  4.     <!ELEMENT CHANNEL (BANNER,DAY+)>  
  5.     <!ELEMENT BANNER (#PCDATA)>  
  6.     <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>  
  7.     <!ELEMENT HOLIDAY (#PCDATA)>  
  8.     <!ELEMENT DATE (#PCDATA)>  
  9.     <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>  
  10.     <!ELEMENT TIME (#PCDATA)>  
  11.     <!ELEMENT TITLE (#PCDATA)>   
  12.     <!ELEMENT DESCRIPTION (#PCDATA)>  
  13.       
  14.     <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>  
  15.     <!ATTLIST CHANNEL CHAN CDATA #REQUIRED>  
  16.     <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>  
  17.     <!ATTLIST TITLE RATING CDATA #IMPLIED>  
  18.     <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>  
  19. ]>  
  20.   
  21. <TVSCHEDULE NAME="">  
  22.     <CHANNEL CHAN="">  
  23.         <BANNER>CCAV</BANNER>  
  24.         <DAY>  
  25.             <DATE>2014-11-17</DATE>  
  26.             <PROGRAMSLOT>  
  27.                 <TIME>19:00</TIME>  
  28.                 <TITLE>新闻联播</TITLE>  
  29.             </PROGRAMSLOT>  
  30.         </DAY>  
  31.     </CHANNEL>  
  32. </TVSCHEDULE>