常用的约束技术:XML DTD
DTD约束快速入门
DTD(Document Type Definition),全称为文档类型定义。
book.xml
- <span style="font-size:18px;"><?xml version="1.0" ?>
- <!DOCTYPE书架 SYSTEM "book.dtd">
- <书架>
- <书>
- <书名>葵花宝典</书名>
- <作者>东方不败</作者>
- <售价>59.00元</售价>
- </书>
- <书>
- <书名>九阳神功</书名>
- <作者>张无忌</作者>
- <售价>57.00元</售价>
- </书>
- </书架>
- </span>
- <span style="font-size:18px;"><!ELEMENT 书架 (书+)>
- <!ELEMENT 书 (书名,作者,售价)>
- <!ELEMENT 书名 (#PCDATA)>
- <!ELEMENT 作者 (#PCDATA)>
- <!ELEMENT 售价 (#PCDATA)>
- </span>
简单标签:<!ELEMENT 标签名 (#PCDATA)>
引入DTD:<!DOCTYPE 根节点 SYSTEM "dtd的地址">
(4)将DTD与XML文档关联的三种形式
DTD约束既可以作为一个单独的文件编写,也可以在XML文件内编写。
- 使用内部DTD 。<!DOCTYPE 根节点 [DTD的代码]>
- 使用外部DTD。<!DOCTYPE 根节点 "DTD的地址">
- 使用网络DTD。<!DOCTYPE 根节点 PUBLIC "DTD的名称" "DTD的地址">
在XML文件内编写DTD
- <span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- <!DOCTYPE 书架 [
- <!ELEMENT 书架 (书+)>
- <!ELEMENT 书 (书名,作者,售价)>
- <!ELEMENT 书名 (#PCDATA)>
- <!ELEMENT 作者 (#PCDATA)>
- <!ELEMENT 售价 (#PCDATA)>
- ]>
- <书架>
- <书>
- <书名>Java就业培训教程</书名>
- <作者>张孝祥</作者>
- <售价>39.00元</售价>
- </书>
- ...
- </书架>
- </span>
当引用的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)元素内容的类型
(3)元素ELEMENT定义
DTD属性(ATTLIST)定义
<!ATTLIST 元素名称
属性名 属性类型 约束
属性名 属性类型 约束
......
>
属性声明举例:
<!ATTLIST 商品
类别 CDATA #REQUIRED 必须的
颜色 CDATA #IMPLIED 可选的
>
对应的XML为:<商品 类别="服装" 颜色="黄色" />
属性值类型:
- CDATA:表示属性的取值为普通的文本字符串。
- ENUMERATED(DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
- ID:表示属性的取值不能重复(不能只写数字)
- #REQUIRED:表示该属性必须出现
- #IMPLIED:表示该属性可有可无。
- #FIXED:表示该属性的取值为一个固定值。语法:#FIXED "固定值"
- 直接值:表示属性的取值为默认值。
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 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
<!DOCTYPE 购物篮 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
DTD 定义属性示例三:
ID属性的值只能由字母,下划线开始,不能出现空白字符。表示属性的设置值是一个唯一值。
- <span style="font-size:18px;"><?xml version = "1.0" encoding="GB2312" ?>
- <!DOCTYPE 联系人列表[
- <!ELEMENT 联系人列表 ANY>
- <!ELEMENT 联系人(姓名,EMAIL)>
- <!ELEMENT 姓名(#PCDATA)>
- <!ELEMENT EMAIL(#PCDATA)>
- <!ATTLIST 联系人 编号 ID #REQUIRED>
- ]>
- <联系人列表>
- <联系人 编号=“p1">
- <姓名>张三</姓名>
- <EMAIL>zhang@it315.org</EMAIL>
- </联系人>
- <联系人 编号=“p2">
- <姓名>李四</姓名>
- <EMAIL>li@it315.org</EMAIL>
- </联系人>
- </联系人列表></span>
实体的引入
实体定义:
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
- 在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
- <!ENTITY 别名 “值”>
- 在元素中引用 &别名;
定义引用实体:
- 概念:在DTD中定义,在XML中使用
- 语法:<!ENTITY 实体名称 “实体内容”>
- 引用方式(注意是在XML中使用):&实体名称;
<!ENTITY copyright “版权所有”>
XML中引用:
©right;
综合实例如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE TVSCHEDULE [
- <!ELEMENT TVSCHEDULE (CHANNEL+)>
- <!ELEMENT CHANNEL (BANNER,DAY+)>
- <!ELEMENT BANNER (#PCDATA)>
- <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)>
- <!ELEMENT HOLIDAY (#PCDATA)>
- <!ELEMENT DATE (#PCDATA)>
- <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)>
- <!ELEMENT TIME (#PCDATA)>
- <!ELEMENT TITLE (#PCDATA)>
- <!ELEMENT DESCRIPTION (#PCDATA)>
- <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED>
- <!ATTLIST CHANNEL CHAN CDATA #REQUIRED>
- <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED>
- <!ATTLIST TITLE RATING CDATA #IMPLIED>
- <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>
- ]>
- <TVSCHEDULE NAME="">
- <CHANNEL CHAN="">
- <BANNER>CCAV</BANNER>
- <DAY>
- <DATE>2014-11-17</DATE>
- <PROGRAMSLOT>
- <TIME>19:00</TIME>
- <TITLE>新闻联播</TITLE>
- </PROGRAMSLOT>
- </DAY>
- </CHANNEL>
- </TVSCHEDULE>