DTD和XML Schema

Download Report

Transcript DTD和XML Schema

DTD和XML Schema
第3章
DTD 和XML Schema



3.1 DTD
3.2 XML Schema
3.3 XML Schema 和DTD的区别
3.1 DTD





3.1.1 DTD简介
3.1.2 DTD的存在方式
3.1.3 XML元素的声明
3.1.4 DTD的属性声明
3.1.5 DTD的实体声明与引用
3.1.1 DTD简介




Document Type Definition 文档类型定义
DTD是一套关于关于标记的语法规则,详细地描述一
组XML文档的结构。
DTD文件严格地规定了将以它为标准的所有实例XML
文档的树状层次结构的全部细节。
对XML文档的有效性验证是可选的
–
–
对文档有效性验证会降低系统的性能
使用DTD对XML文档进行有效性验证将限制其扩展性
3.1.2 DTD的存在方式


DTD语句也称DTD声明,它使用一套与XML完全不同的语法规
则进行编写。
内部DTD:存在于XML文档本体中元素、属性或实体的DTD声
明
–
–

外部DTD:对XML元素和属性等的声明包含在一个单独的DTD
文件中。
–
–
–

以”<! DOCTYPE”开始,以”]>”结束
DOCTYPE是DTD的关键字,必须大写
方便共享
SYSTEM引用:主要用于一个作者或组织所编写的众多XML文档中
通用的DTD
PUBLIC引用:引用公开给公众使用的DTD
内部DTD和外部DTD结合使用
3.1.3 XML元素的声明
示例 内部DTD
<?xml version="1.0" standalone="yes"?>
<!DOCTYPE REGARD [
<!ELEMENT REGARD (#PCDATA)>
]>
<REGARD>
HelloXML!
</REGARD>

3.1.3 XML元素的声明

列出元素
–
–
–
–
要为一个文档创建适当的DTD,第一步是了解用
DTD中定义的元素编码的信息结构。
所编写的DTD要为每个元素作元素声明。每一元素
声明列出元素名和它的子元素。
清单:需要编写DTD结构完整的XML文档 31.doc
表:学生成绩统计中的元素 表3-1.doc
3.1.3 XML元素的声明


在合法的XML文档中使用的每项标记都要在DTD
中的元素声明中加以声明。一项元素声明指明
了元素名称和元素可能的内容。
元素声明的基本语法:
<!ELEMENT 元素名称 元素内容描述>
– ELEMENT是DTD的关键字,必须大写
– 元素名:命名规则与标记的命名规则同
– 元素内容描述:规定该元素将包含哪些子元素及子
元素之间的顺序,或者对于不包含子元素的元素定
义其数据类型。
3.1.3 XML元素的声明
1.
2.
3.
4.
空元素类型
ANY元素类型
父元素类型
只包含文本的元素类型
1、 空元素的声明
即没有内容的元素
 <!ELEMENT 元素名 EMPTY>
 例如:<!ELEMENT HR EMPTY>
这样,在XML文件中,就可以使用一个空元素
<HR/>。

2、ANY元素类型

是XML为某些结构性比较差的元素提供的说明方法,它
对该元素不作限制。
–
–
–
–



可以包含任何在该DTD中声明过的子元素
这些子元素的出现次数与次序不作限制
可以包含文本数据,即(#PCDATA)型数据
数据内容与子元素可以交错出现
语法: <!ELEMENT 元素名 ANY>
例如:<!ELEMENT SEASON ANY>
关键词ANY(也要区分大小写)表明所有可能的元素以
及可解析的字符数据都可以是SEASON元素的子元素。
对于根元素特别是未结构化的文档,使用ANY常见,但
在其他大多数情况下,尽量避免使用。
4.只包含文本的元素类型
元素的内容完全是文本形式的元素类型
 例如:<!ELEMENT YEAR (#PCDATA)>
该声明说明YEAR只能包含可析的字符数据,即非标记
文本,但它不能包含自己的子元素。所以,下面这个
YEAR元素是合法的:
<YEAR>1998</YEAR>;
不合法:
<YEAR>
<MONTH>January</MONTH>
<MONTH>February</MONTH>
</YEAR>

3.父元素类型


XML文档本身通过元素之间的嵌套关系描述
了数据(元素)之间的树状结构关系。
子元素声明中包括:
–
–
–

子元素名称
子元素出现的次数及次序
见下图:结构符合的具体描述
一个元素的各个子元素之间可以以任意顺序出
现,也可以强制遵循一定的顺序。
–
不要求顺序的子元素
结构
符号
使用方法
应用实例 实例说明
( )
将括号内的元素或数据类 (A,B,C)
型合并为一个单元
A,B,C可能是元素或#PCDATA数
据,将A,B,C合成一个单位
,
元素或数据以出现的顺序 (A,B,C)
排列
元素A,B,C以出现的顺序排列
*
该元素或是由括号形成的 A*
单位出现任意次数,包括 (A,B)*
0次
前一例说明元素A可能出现任意
次;后一例表明元素A和B以一前
一后的次序出现任意次
+
该元素或由括号形成的单 A+
位出现任意次数,不包括 (A,B)+
0次
前一例说明元素A可能至少出现
一次;后一例表明元素A和B以一
前一后的次序至少出现一次
?
该元素或由括号形成的单 A?
位出现至多出现一次,即
0次或1次
元素A出现0次或1次
|
在该元素范围内的元素只 (A|B|C)
能并必须出现一个
元素A出现或B出现或C出现
3.父元素类型
考虑下面的DTD定义:
同样,下面这个XML文件也是有效的:
<!ELEMENT 联系人(姓名 EMAIL)> <联系人>
<!ELEMENT 姓名(#PCDATA)>
<EMAIL>[email protected]</EMAIL>
<姓名>张三</姓名>
<!ELEMENT EMAIL(#PCDATA)>
遵从这个DTD的XML文件可以为: </联系人>
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
在DTD定义中仅仅用空白符分隔
了元素“联系人”的两个子元素,
这说明并没有严格要求两个元素
出现的顺序,因此上面两种写法
都是允许的。
3.父元素类型

要求顺序的子元素
– 在上面例子中,如果我们使用逗号“,”来分隔两
个子元素,那么XML文件中,元素“姓名”就必须
出现在元素“EMAIL”前面。也就是说,如果我们把
DTD定义为下面的形式:
–
<!ELEMENT 联系人(姓名, EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
3.父元素类型
那么下面的文件是有效的:
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
而下面这个文件不是有效的,因为它把元素“EMAIL”放在了元素
“姓名”之前,这是不合规定的:
<联系人>
<EMAIL>[email protected]</EMAIL>
<姓名>张三</姓名>
</联系人>
3.父元素类型
重复元素
<!ELEMENT 联系人(姓名,EMAIL+)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
它说明一个“联系人”元素中必须含有一个
“姓
名”元素,后面接一个或多个“EMAIL”元素。

这样,下面的这段XML文件是“有效的”。
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
<EMAIL>[email protected]</EMAIL>
<EMAIL>[email protected]</EMAIL>
</联系人>
<联系人>
<姓名>张三</姓名>
</联系人>
这个片段不是有效的,因为
它没有“EMAIL”元素,而
“+”代表了“一个或多个”。
如果你需要表示“零个或多
个”,那么应该使用字符
“*”。
3.父元素类型

成组元素:子元素可以使用括号并为一组。
– 下面的DTD片段说明,一个“联系人”元素中可以
有一个或多个“姓名/EMAIL”子元素对,并且在每
个子元素对中,“姓名”都放在“EMAIL”之前。
<!ELEMENT 联系人(姓名,EMAIL)+>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
3.父元素类型
符合这个DTD的XML文件可以是:
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>

<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>

<姓名>王五</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
注意,仅仅是因为“+”由括号里面移到括号外面,元
素“联系人”的内容就大大不同了。
OR或


符号“|”描述了一个OR操作。
因此,下面的DTD片段所规定的XML元素是:所
有的“联系人”元素应该有一个“姓名”子元
素,同时,在此之后还应该有一个“电话”或
一个“EMAIL”元素,但不能同时有“电话”和
“EMAIL”两个元素。
<!ELEMENT 联系人(姓名,(电话|EMAIL))>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
OR或
<联系人>
<姓名>张三</姓名>
</联系人>
这个例子是一个“无效的”XML片段,因为DTD中规定或者有一个
“电
话”元素,或者有一个“EMAIL”元素,但上面这个例子中两种元素
都
没有。
<联系人>
<姓名>张三</姓名>
<电话>12345678</EMAIL>
<EMAIL>[email protected]</EMAIL>
</联系人>
同样,这个例子仍是一个“无效的”XML片段,因为它既有“电话”元素,
又有“EMAIL”元素。
OR或
一个符合上述DTD定义的“有效的”XML文件的定义应该是:
<联系人>
<姓名>张三</姓名>
<电话>12345678</EMAIL>
</联系人>
或者是:
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
注意:在一个组中,只允许使用一种连接符(例如“,”或“|”)。
因
此,象下面这样定义的DTD是不合法的:
<!ELEMENT 联系人(姓名,电话|EMAIL)>
要想使用多种连接符,只有通过创建子组的方式,使用
<!ELEMENT 联系人(姓名,(电话|EMAIL))>
可选子元素
字符“?”说明一个子元素是可选的,它可以出现,也可以不出现。
因此,在下面的DTD中,我们规定,每一个“联系人”都必须有一个
“姓名”子元素,同时或者有一个“电话”子元素,或者有一个
“EMAIL”
子元素,此外,它还可以包含一个“地址”子元素,也可以不包含
这
种元素。
<!ELEMENT 联系人(姓名,(电话|EMAIL),地址?)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ELEMENT 地址(街道,城市,省份)>
<!ELEMENT 街道 (#PCDATA)>
<!ELEMENT 城市 (#PCDATA)>
<!ELEMENT 省份 (#PCDATA)>
可选子元素
下面的XML片段是“有效
的”:
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</E
MAIL>
<地址>
<街道>五街1234号</街
道>
<城市>北京市</城市>
<省份>北京</省份>
</地址>
</联系人>
同样,下面这段不包含“地址”
元素的XML片段也是“有效的”:
<联系人>
<姓名>张三</姓名>
<EMAIL>[email protected]</E
MAIL>
</联系人>
混合内容
一个元素中既希望包含子元素,也希
望包含纯文本。XML中允许这种使用方
法,并把这种元素称为混合内容的元
素。
 在下面的例子中,“联系人”就是一
个混合元素。

混合内容
<?xml version = “1.0” encoding=“GB2312” standalone = “yes”?>
<!DOCTYPE 联系人列表 [
<!ELEMENT 联系人列表 (联系人)*>
<!ELEMENT 联系人(姓名|电话|EMAIL|#PCDATA)*>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 电话(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
]>
<联系人列表>
<联系人>
<姓名>张三</姓名>
<电话>(010)62345678</电话>
<EMAIL>[email protected]</EMAIL>
这是关于张三的信息
</联系人>
</联系人列表>
注意,由于在“(姓名|电话|EMAIL|#PCDATA)”之外有“*”,所以在元
素
“联系人”中可以包含零个或多个“姓名”、电话、EMAIL和纯文本字
小结


除了根元素外,在定义其它元素时使用关键字ANY都
是不好的习惯。一般来说,在写一个XML文件时需要
严格遵循DTD的规则,这时,一个定义明确的DTD,
虽然表面上似乎充满了条条框框,但实际上会使你
在书写XML文件时有规可循,反而方便了你的工作和
语法分析器的工作。相反,一个在元素定义中充满
了ANY的DTD,反而可能会搞得你不知所措,一头雾
水。
不能对不同的元素使用相同的元素名,即便这些元
素的内容、包含的子元素不同也不行,因为它只会
引起文件各个元素的混淆,使文件的可读性大打折
扣。
小结

定义元素时,顺序是无关紧要的。因此
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
和
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名)>
<!ELEMENT 姓名(#PCDATA)>
所定义的文件结构是完全相同的。
小结



元素名的第一个字母必须是字母、或下划线(_)、
或冒号(:),后跟字母、数字、句号(.)、冒号、
下划线、连结号(-)的组合,并且不能包含空白符,
不能以“xml”开头。
另外,尽管元素的第一个字母使用冒号是合法的,
但最好避免这样做,因为它会引起混淆。
需要注意的是,尽管XML1.0标准允许使用任何长度
的文件名,但是实际的XML处理器常常会限制标记名
的长度。
习
题
1.何谓DTD?在XML文件中使用DTD有何好处?
2.在合法的XML文档中使用的每项标记都要在
DTD中的元素声明中加以声明,请简述以下几
种声明方式:
序列;零或多个子元素零;选择。
习
题(续)
3.请撰写一个实际XML文件来说明引用底下的
DTD?
<?xml version=”1.0”?>
<!ELEMENT book (title,author,breakline,publish,price,language)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT language (#PCDATA)>
<!ELEMENT breakline EMPTY>
习
题(续)
4.请撰写一个实际XML文件来说明下
面的DTD?
<? Xml version = “1.0” encording = “GB2312”?>
<!DOCTYPE 汽车[
<!ELEMENT 汽车(品牌,车主,保险公司*,银行贷款?,维修地点)〉
<!ELEMENT 品牌(#PCDATA)〉
<!ELEMENT 车主(#PCDATA)〉
<!ELEMENT 保险公司(#PCDATA)〉
<!ELEMENT 银行贷款(#PCDATA)〉
<!ELEMENT 维修地点(#PCDATA)〉
]>
3.1.4 DTD的属性声明




开始标记和空标记可包含由等号“=”分割开
的成对的属性名和属性值
属性包含有关元素内容信息,而不是元素内容
本身。
元素可具有多个属性
结束标记不能带属性
3.1.4 DTD的属性声明
属性是XML提供的描述元素某些性质的
信息。
 在一个有效的XML文档中,属性要经过
DTD的属性说明。
 在DTD声明中,属性的声明语法为:

<!ATTLIST 元素名 属性名 属性类型 属性默认值类型>
– 元素名为属性所属的元素的名称
– 属性类型是对属性值的约束
3.1.4 DTD的属性声明


例如:
<商品 类型 =“服装” 颜色 = "黄色">
元素名是“商品”;属性名是属性的命名, “类型”
和“颜色”是属性名;默认值说明在XML文件中,如果
没有特别说明属性的取值,语法分析器默认它具有的
取值;属性类型则用来指定该属性是属于有效属性类
型中的哪种类型。
注意:由于ATTLIST是一个属性的列表,它可以包含很
多属性,在实际应用中,一个元素也经常有多个属性。
属性默认值类型
1) #IMPLIED:属性值可有可无的属性,而且也无须在DTD
中为该属性提供缺省值。
 语法:<!ATTLIST 元素名称 属性名称 #IMPLIED>
 有时用户在不强制指定特定默认值的情况下省略特定属
性值。
 例如,可以拥有一个SHIRT(衬衣)元素,其具有一个
声明为NMTOKEN的SIZE属性。但有些衬衫属于均码,没
有尺寸。可以省去SIZE这个值,并且处理器隐含这个衬
衫属于均码,
<!ATTLIST SHIRT SIZE NOTOKEN #IMPLIED >
<SHIRT>---符合上述定义
<SHIRT SIZE=“”>---不符合上述定义
属性默认值类型
2) #REQUIRED:必须赋值的属性
 关键字REQUIRED说明XML文件中必须为这个属性给出
一个属性值。
 与提供默认值相反的情况,文档类型设计者需要强制
作者选择一个值。如果属性值既重要又无法可靠地默
认确定,那么设计者可以要求作者用该属性默认值来
指定。
 例如:<!ATTLIST IMAG URL CDATA #REQUIRED>
这种情况下,DTD设计者使URL属性在所用IMAG元素上
都成为必需。之所以这样做是因为如果没有一个URL
定位图像文件,则此IMAGE元素没有任何意义。
属性默认值类型
3) #FIXED:表明该属性一定要出现,且固定为特定值,不许用其
他值。
 当需要为一个特定的属性提供一个缺省值,并且不希望XML文
件的编写者把你的缺省值替代掉。这时候,就可使用FIXED关
键字,同时为该属性提供一个缺省值。
4) 特定属性值表明该属性的默认值,当XML文档中没有显式给出
该属性的取值时,取此值。当该属性的取值已经显式地给出,
则为给出值。
 如果不使用上面任何一种关键字的话,该种属性就是属于这种
类型。对于这种属性,你需要在DTD中为它提供一个缺省值。
而在XML文件中可以为该属性给出新的属性值来覆盖事先定义
的缺省值,也可以不另外给出属性值,后一种情况下它就默认
为采用DTD中给出的缺省值。
属性类型
类 型
含 义
CDATA
字符数据不是标记的文本
枚举型
可能取值的列表,可从中选出正确的值
ID
不能被文档中其他任何ID类型属性共享的数字,具有惟一性
IDREF
文档中元素的ID类型属性的值
IDREFS
由空格分开的若干个ID
ENTITY
在DTD中声明的实体名
ENTITIES
在DTD中声明的若干个实体的名字,彼此间由空格分开
NMTOKEN
XML名称
NOTATION
在DTD中声明的注释名
NMTOKENS
由空格分开的多个XML名称
属性类型
(1)CDATA类型:是最简单的属性类型,也是约束最少的属性类型。即
Character Data 缩写,代表该属性值为一般的文字,除此没有其它限
制.
 语法:

<!ATTLIST 元素名称
例如:
属性名称
CDATA
属性默认值类型>
<?xml version = "1.0“ encoding="GB2312" standalone = "yes"?>
<!DOCTYPE 剧本 [
<!ELEMENT 剧本 ANY>
<!ELEMENT 对话 (#PCDATA)>
<!ATTLIST 对话 演员 CDATA>
]>
<剧本>
<对话 演员=“某甲”>我可不这么认为!</对话>
<对话 演员=“某乙”>为什么呢?</对话>
</剧本>
属性类型
(2)枚举型:列举了该属性所能取得的全部值.
 语法:
<!ATTLIST 元素名称 属性名称 (可选属性值1|可选属性值2|……|可选属性值N) 属性
默认值类型>

例如:
<?xml version = “1.0”
encoding=“GB2312” standalone = “yes”?>
<!DOCTYPE 购物篮 [
<!ELEMENT 购物篮 ANY>
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 类型( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) “鸡肉”>
]>
<购物篮>
<肉 类型 = “鱼肉”/>
<肉 类型 = “牛肉”/>
<肉/>
</购物篮>
注意,在上面这个例子中,给属性“类型”定义的缺省值是“鸡肉”,所以“购
物篮”中的第三个元素的“类型”属性取值为“鸡肉”。
属性类型
(3)NMTOKEN和NMTOKENS类型:一个有效的XML
名称,必须以字母或者下划线开始,之后是字母、数
字下划线、短横线或圆点,而且不能包含空格。
后者表明属性值可能由若干个满足NMTOKEN属性要
求结合在一起形成的,即多个NMTOKEN之间可能存
在空格。
 语法:
<!ATTLIST 元素名称
性默认值类型>
属性名称 NMTOKEN|NMTOKENS 属
属性类型
例如1:
<!ATTLIST Employee security_level NMTOKEN
#REQUIRED>
<Employee security_level=“trusted”>
 上述代码表示元素E m p l o y e e有一个名为s e c u r i t y
_ l e v e l的属性,其值符合X M L名称记号的规则。我们
可以用它来控制对机密文档的访问。由于定义属性列表时
使用了N M TO K E N,而不是枚举类型,文档创作者只
需创建新的值,就能够适应新的安全级别要求,而不必每
次都编辑D T D。只要符合我们前面介绍的有效的N M TO
K E N值应该遵守的规则任何值都可以作为这种属性的值。

属性类型
例如2:
<!ATTLIST Employee security_compartments NMTOKENS
#IMPLIED>
<Employee security_compartments=“red green mega ultra ”>
这个职员能够访问名为r e d、g r e e n、m e g a和u l t r a的安
全区域。就类型而言,这些都是有效的N M TO K E N值。与枚举类型
不同,解析器不检查这些值的有效性。文档的作者必须确保自己使
用了适当的名称。

属性类型
例如3:
<!ELEMENT 数据(#PCDATA)>
<!ATTLIST 数据 安全性( ON | OFF ) "OFF“
授权用户 NMTOKENS #IMPLIED >
Xml文件:
<数据 安全性="ON" 授权用户 = "IggieeB
SelenaS GuntherB">
blah blah blah
</数据>

属性类型

NMTOKEN属性类型
–
–
NMTOKEN属性类型限定属性值为有效的XML名
称。
当需要从大量名字中选取不是XML的规定部分但
与XML命名要求相符的名字时,就能体现
NMTOKEN的用途。
属性类型

NMTOKENS属性类型
–
NMTOKENS属性类型几乎就是NMTOKEN的复数
形式。这种类型的属性可以使如下情况合法——属
性由若干XML名称字组成,彼此间由空格分隔。
通常可为使用NMTOKEN属性相同的理由而使用
NMTOKENS属性,但仅仅在需要多个名字的时候。
属性类型
(4)ENTITY和ENTITIES类型:当属性值是一个外部实体的引用时,
用ENTITY来说明属性类型。
一般来说,当属性值是一个内部实体引用时,将属性类型声明为
CDATA即可。
 实体属性类型
实体类型的属性值属于一般实体,如前所述,它的定义方式是:
<!ENTITY 实体名 “实体内容”>
或利用SYSTEM定义外部实体,方式为:
<!ENTITY 实体名 SYSTEM “外部文件名”>
– 引用方式为:
&实体名;
使用关键字ENTITY,则声明一个属性是实体类型,它的取值为已定
义的实体。请看下面例子:
–
属性类型
<?xml version = "1.0" encoding="GB2312“
standalone = "yes"?>
<!DOCTYPE 文件[
<!ELEMENT 文件 ANY>
<!ELEMENT 电影 EMPTY>
<!ATTLIST 电影 来源 ENTITY #REQUIRED>
<!ENTITY pic SYSTEM “1-5.jpg">
]>
<文件>
<电影 来源 = "pic">
</文件>
属性类型

ENTITY属性类型
–
–
ENTITY类型的属性提供把外部二进制数据和外部
不可析实体链接到文档中的能力。ENTITY属性值
为DTD中声明的不可析通用实体名,该实体名链接
到外部实际数据。
经典的ENTITY属性的例子就是图像。图像由另一
URL处可用的二进制数据组成。
属性类型

ENTITIES属性类型
–
ENTITIES属性类型几乎就是ENTITY的复数形式。
若干由空格分隔的不可析实体名组成ENTITIES类
型属性的值。每一实体名指向一个外部非XML数
据资源。
属性类型
(5)NOTATION类型:



现实世界中存在着很多无法或不易用XML格式组织的数据,例如图象、声音、
影象等等。对于这些数据,XML应用程序常常并不提供直接的应用支持。通
过为它们设定NOTATION类型的属性,可以向应用程序指定一个外部的处理
程序。例如,当你想要为一个给定的文件类型指定一个演示设备时,可以
用NOTATION类型的属性作为触发。
要使用NOTATION类型作为属性的类型,首先要在DTD中为可选用的记号作出
定义。
<!NOTATION 格式 SYSTEM|PUBLIC 处理程序的URI>
<!ATTLIST 元素名称 属性名称 NOTATION 属性默认值类型>
例如:
属性类型
在下面这个例子中,为“电影”元素指定了两种可选设备:
一种是movPlayer.exe,用来播映.mov文件,另一种则用来绘制GIF
图象。
<?xml version = "1.0” encoding="GB2312“ tandalone = "yes"?>
<!DOCTYPE 文件[
<!ELEMENT 文件 ANY>
<!ELEMENT 电影 EMPTY>
<!ATTLIST 电影 演示设备 NOTATION (mp|gif) #REQUIRED>
<!NOTATION mp SYSTEM "movPlayer.exe">
<!NOTATION gif SYSTEM "Image/gif">
]>
<文件>
<电影 演示设备 = "mp"/>
</文件>
属性类型

NOTATION属性类型
–
NOTATION属性类型指定属性值为DTD中声明的
记号名。这一属性的默认值也必须为DTD中声明的
记号名。
属性类型
(6)ID类型:
 ID是用属性值的方式为文件中的某个元素定义唯一标识
的方法
 ID的值必须是一个有效的XML名称,它由字母、数字或下
划线开始,名字中不能出现空白符。
 不要给ID类型的属性事先指定缺省值,这很容易引起不
同的元素具有相同的标识的情况,更不能使用FIXED型的
缺省值。此类属性经常使用REQUIRED缺省类型,当然,
这也不是必须的。有的应用并不要求每个元素都有自己的
标识,所以,也可以使用IMPLIED缺省类型。
属性类型
<?xml version = "1.0" encoding="GB2312“ standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 联系人 编号 ID #REQUIRED>
]>
<联系人列表>
<联系人 编号="1">
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
<联系人 编号="2">
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
</联系人列表>
属性类型

ID属性类型
–
–
–
一个ID类型的属性标识文档中惟一的元素,编辑工具和其余
应用程序通常使用ID列举文档中的元素,并不关心元素的实
际意义和各元素彼此之间的关系。
一个ID类型属性值必须为有效的XML名称,该名称以字母开
头,由字母数字混排的字符和下划线组成,并且其中不带空
格。
ID类型属性与#FIXED类型的属性不兼容。
属性类型
(7)IDREF和IDREFS类型:



ID REFERENCE的意思,表明该属性的取值是对声明过
的一个ID型属性值的引用,也就是说,IDREF类型的值
必须匹配某些ID属性的值。
IDREFS类型表明该属性的取值是对声明过的多个ID型
属性值的引用,各ID值以空格分开。
例如:idref属性.xml;idref2属性.xml
属性类型
<?xml version = "1.0" encoding="GB2312“ standalone = "yes"?>
<!DOCTYPE 联系人列表[
<!ELEMENT 联系人列表 ANY>
<!ELEMENT 联系人(姓名,EMAIL)>
<!ELEMENT 姓名(#PCDATA)>
<!ELEMENT EMAIL(#PCDATA)>
<!ATTLIST 联系人 编号 ID #REQUIRED>
<!ATTLIST 联系人 上司 IDREF #IMPLIED>
]>
<联系人列表>
<联系人 编号="2">
<姓名>张三</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
<联系人 编号="1" 上司="2">
<姓名>李四</姓名>
<EMAIL>[email protected]</EMAIL>
</联系人>
</联系人列表>
综合举例
我们学习了元素、属性和内容类型的基本知识。下面提供通过例子,理解XML文档如
何道循DTD元素和属性表说明。

一个分类广告文档的DTD:文件名为output.dtd
<! ELEMENT AD (NEWSPAPER, (INCOLUMN|DISPLAY ) ) >
<!ENTITY ADTEXT SYSTEM “adText.txt” >
<!ATTLIST AD id ID #REQUIRED >
<!ELEMENT NEWSPAPER (#PCDATA)>
<!ELEMENT INCOLUMN (INCOLUMNSIZE, INCOLUMNCONTENT)>
<!ELEMENT INCOLUMNSIZE (#PCDATA)>
<!ELEMENT INCOLUMNCONTENT (#PCDATA)>
<!ATTLIST INCOLUMNSIZE lines NMTOKEN #REQUIRED >
<!ATTLIST INCOLUMNCONTENT width (1|2|3|4|5|6|7) #REQUIRED >
<!ELEMENT DISPLAY (DISPLAYSIZE, DISPLAYCONTENT)>
<!ELEMENT DISPLAYSIZE (#PCDATA)>
<!ELEMENT DISPLAYCONTENT (#PCDATA)>
<!ATTLIST DISPLAYSIZE lines NMTOKEN #REQUIRED >
<!ATTLIST DISPLAYCONTENT width (1|2|3|4|5|6|7) #REQUIRED >

综合举例
<?XML version=“1.0” standalone=“no” ?>
<!DOCTYPE AD SYSTEM “output.dtd”>
<AD id=“001”>
<NEWSPAPER> San Francisco Chronicle </NEWSPAPER>
<INCOLUMN>
<INCOLUMNSIZE lines=“50” width=“1”>
</INCOLUMNSIZE>
<INCOLUMNCONTENT>&ADTEXT;</INCOLUMNCONTENT>
</INCOLUMN>
</AD>
3.1.5 DTD的实体声明与引用

一般实体的声明与引用
–
声明:

–
引用


<!ENTITY 一般型实体名称 “实体代表的内容”>
&一般实体名称
参数型实体的声明和引用
–
声明:

–
–
<! ENTITY % 参数型实体名称 “实体代表的内容”>
特征:P49
示例:例3.3.dtd
3.1.5 DTD的实体声明与引用

正确声明和引用实体
1.
2.
3.
4.
一般型实体声明后,可在XML主体文档中被引用,这
包括在元素内容和在设置属性值时引用。一个一般型
实体的声明中被引用,但是不能在元素声明中被引用。
实体声明中引用实体时,不能形成死循环
参数型实体必须在外部DTD中进行声明,而不能在内
部DTD中声明。
在XML文档主体中只能引用一般型实体,引用参数型
实体并不能达到引用相应内容的效果