更新时间:2023-06-14 来源:黑马程序员 浏览量:
在DTD文档中,定义元素的同时,还可以为元素定义属性。DTD属性定义的基本语法格式如下所示:
<!ATTLIST元素名 属性名1属性类型设置说明 属性名2属性类型设置说明 ... >
在上面属性定义的语法格式中,“元素名”是属性所属元素的名字,“属性名”是属性的名称,“属性类型”则是用来指定该属性是属于哪种类型,“设置说明”用来说明该属性是否必须出现。关于“属性类型”和“设置说明”的相关讲解,具体如下。
1.设置说明
定义元素的属性时,有4种设置说明可以选择,具体如下。
(1) #REQUIRED
#REQUIRED表示元素的该属性是必需的,例如,当定义联系人信息的DTD时,我们希望每一个联系人都有一个联系电话属性,这时,可以在属性声明时,使用REQUIRED.
(2) #Ahp IMPLIED
#IMPLIED表示元素可以包含该属性,也可以不包含该属性。例如,当定义一本书的信息时,发现书的页数属性对读者无关紧要,这时,在属性声明时,可以使用IMPLIED。
(3) #FIXED
#FIXED表示一个固定的属性默认值,在XML.文档中不能将该属性设置为其他值。使用#FIXED关键字时,还需要为该属性提供一个默认值。当XML文档中没有定义该属性时,其值将被自动设置为DTD中定义的默认值。
(4)默认值
和FIXED一样,如果元素不包含该属性,该属性将被自动设置为DTD中定义的默认值。不同的是,该属性的值是可以改变的,如果XML文件中设置了该属性,新的属性值会覆盖 DTD中定义的默认值。
2.属性类型
在DTD中定义元素的属性时,有10种属性类型可以选择,具体如下。
(1) CDATA
这是最常用的一种属性类型,表明属性类型是字符数据,与元素内容说明中的#PCDATA相同。当然,在属性设置值中出现的特殊字符,也需要使用其转义字符序列来表示,例如,用&表示字符(&),用&.lt;表示字符(<)等。
(2) Enumerated
在声明属性时,可以限制属性的取值只能从一个列表中选择,这类属性属于Enumerated(枚举类型)。需要注意的是,在DTD定义中并不会出现关键字Enumerated。接下来通过一个案例来学习如何定义Enumerated类型的属性,如下所示。
<? xml version="1.0" encoding="GB2312" standalone▪"yes"?> <!DOCTYPE 购物篮 [ <!ELEMENT 购物篮 ANY> <!ELEMENT 肉 EMPTY> <!ATTLIST 肉 品种(鸡肉|牛肉|猪肉|鱼肉)"鸡肉"> ]> <购物篮> <肉 品种=“鱼肉”/> <肉 品种=“牛肉”/> <肉/> </购物篮>
“品种”属性的类型是Enumerated,其值只能为“鸡肉”、“牛肉”、“猪肉”和“鱼肉”,而不能使用其他值。“品种”属性的默认值是“鸡肉”,所以,即使<购物篮>元素中的第三个子元素没有显式定义“品种”这个属性,但它实际上也具有“品种”这个属性,且属性的取值为“鸡肉”。
(3) ID
一个ID类型的属性用于唯一标识XML文档中的一个元素。其属性值必须遵守XML.名称定义的规则。一个元素只能有一个ID类型的属性,而且ID类型的属性必须设置为#IMPLIED或#REQUIRED。因为ID类型属性的每一个取值都是用来标识一个特定的元素,所以,为ID类型的属性提供默认值,特别是固定的默认值是毫无意义的。接下来通过一个案例来学习如何定义一个ID类型的属性,如下所示。
<?xml version="1.0" encoding="GB2312" standalone="yes" ?> <!DOCTYPE 联系人列表 [ <!ELEMENT 联系人列表 ANY> <!ELEMENT 联系人(姓名,EMAIL)> <ELEMENT 姓名(#PCDATA)> < !ELEMENT EMAIL(#PCDATA)> <!ATTLIST联系人编号ID #REQUIRED> ]> <联系人列表> <联系人编号="idl"> <姓名>张三</姓名> <EMAIL> zhang@itcast.cn</EMAIL> </联系人> <联系人 编号="id2"> <姓名>李四</姓名> <EMAIL>1ieitcast.cn</EMAIL> </联系人> </联系人列表>
将元素为<联系人>的编号属性设置为#REQUIRED,说明每个联系人都有一个编号,同时,属性编号的类型为ID,说明编号是唯一的。如此一来,通过编号就可以找到唯一对应的联系人了。