曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
枚举类型,文档创作者只需创建新的值,就能够适应新的安全级别要求,而不必每次都编辑
D T D。只要符合我们前面介绍的有效的N M TO K E N值应该遵守的规则,任何值都可以作为这种
属性的值。
显然,N M T O K E N类型使得应用程序必须承担验证值有效性的任务。然而对于枚举类型,
解析器能够提供有效性检查。
与I D R E F S和E N T I T I E S类似,你可以声明属性类型N M TO K E N S,它的值由多个名称记号构
成。每个名称必须是有效的名称记号,它们之间以空格分隔:
程序清单3 - 11
这个职员能够访问名为r e d、g r e e n、m e g a和u l t r a的安全区域。就类型而言,这些都是有效的
N M TO K E N值。与枚举类型不同,解析器不检查这些值的有效性。文档的作者必须确保自己使
用了适当的名称。
6. NOTAT I O N:非X M L数据
当我们讨论实体类型的属性时,曾经提及表示法。通过将实体名称作为属性值,可以将G I F
和J P E G图形文件与元素相关联。然而, X M L解析器不能处理二进制格式。那么,解析器的作用
是什么呢?我们可以使用表示法标识要链接到X M L文档的外部数据项的格式。表示法声明能够
说明格式的名称,以及相关的外部处理器。解析器可以根据声明将自己不能识别的数据交给外
部处理器处理。处理器声明类似于用于定位D T D文件的D O C T Y P E声明。它可以是P U B L I C或
S Y S T E M的,而且必须包含外部处理器的名称:
现在我们知道,当j p g作为表示法名称时,与之相关的数据将发送给j p g v i e w e r. e x e处理。利
用表示法, X M L文档可以容纳多种不同的数据类型。这对于报表、病历、法律文书、学术报告,
以及任何丰富多彩的多媒体演示来说都是非常有用的。但是, X M L仅仅是一个最基本的工具集。
为了提供正确的表示语义,应用程序还有大量工作要做。
通过使用关键字N O TAT I O N,可以将属性定义为表示法名称类型的。例如:
66使用XML 高级编程
下载
在以上声明中, I m a g e元素可以有一个名为t y p e的属性,它是表示法类型的。该属性可选的
值有g i f和j p g。如果元素实例没有定义t y p e属性,解析器会假设该属性设置为缺省值g i f。然而,
在上述实例中,值j p g覆盖了缺省值。
7. 枚举类型:选择
名称记号的长度是不受限的。虽然N M TO K E N和N M TO K E N S属性值的格式必须符合命名规
则,但是它所允许的值是可以自由设置的。在许多情况下,我们只希望允许一小部分字符串值,
例如:y e s和n o是表示决策的枚举值; r e d、y e l l o w和g r e e n是信号灯的颜色,等等。在这些情况下,
我们要采用枚举属性。
为了声明枚举属性,在通常出现类型关键字的位置应该放置一组值。这些可选值包含在圆
括号中,并以管道符号( |)分隔。声明中的可选值不需要带引号,但是与X M L中的名称一样,
它是大小写敏感的。文档中的属性实例必须包含唯一的一个可选值,且这个值必须是在属性声
明中列举的。与其他属性值类似,枚举值必须包含在引号中。下面是两个简单的例子:
程序清单3 - 1 2
在第一个例子中,属性值只能是y e s或n o;Y E S、N O和m a y b e都是无效的。设置属性值时,
不仅必须使用枚举类型声明中提供的值,而且要注意大小写。如果你构建的枚举类型的值可能
由用户手工输入,应该考虑因大小写产生的各种变体。
现在让我们讨论D T D中使用的另一种技术。
3.3.4 条件部分
许多程序员都习惯于在程序中指定要解析的信息,仅当满足特定的条件时,编译器才解析
指定的内容。D T D提供了类似的功能,虽然它比通常的编程语言有更多的限制—运行时不能
执行条件表达式。D T D可以包含条件部分,它用于向解析器说明包含或忽略声明部分。它们能
够用来控制D T D中的相关声明块。然而, D T D内部子集不支持条件部分。
条件部分包括:惊叹号、左方括号、关键字,以及由方括号包含的声明块。如果关键字为
I N C L U D E,其中的声明被认为是D T D的一部分。如果关键字为I G N O R E,处理器虽然读取其中
的声明,但是在处理时忽略它:
程序清单3 - 1 3
第3章文档类型定义使用67 下载
在上例中, A u d i t E n t r y及其属性将成为D T D的一部分,D e b u g E n t r y及其属性则不会对D T D产
生任何影响。根据该D T D创建的文档可以使用A u d i t E n t r y,但是文档中的D e b u g E n t r y元素会被认
为是无效的。
这一特征乍看起来没有什么价值。如果你不需要某些声明,为什么还要将它们添加到D T D
中呢?如果声明包含在D T D中,为什么要使用I N C L U D E呢?实际上,条件部分应该与参数实体
配合使用。让我们更改一下以上实例,并就条件部分的用法作进一步说明。假设创建文档时,
我们在文档实例的D O C T Y P E声明中写入以下实体声明:
程序清单3 - 1 4
假设文档在创建时需要包含调试信息或计费信息。如果D T D外部子集包含以下代码:
程序清单3 - 1 5
然后,假设文档实例是要交给财务部门的:
程序清单3 - 1 6
68使用XML 高级编程
下载
这样,文档就能够正确地验证有效性。
由于内部D T D子集中的声明是先读的,因此实际上,参数实体声明是出现在外部D T D子
集中的参数实体引用之前的。
在以上例子中,我们需要的是在生产环境中用于审核的元素,但是在某些情况,出于测试
或错误检测的需要,我们可能希望在文档中包含用于调试的元素。与A u d i t E n t r y相关的声明将包
含在D T D中,而与D e b u g E n t r y相关的声明将被忽略。为了将D e b u g E n t r y作为文档的有效元素,
只需交换参数实体的关键字,这一操作是相当简单的。如果使用恰当,条件部分能够提供大量
功能,并改善代码的可重用性。
3.4 DTD的缺点
D T D能够有效地推动X M L的发展。然而,它也受到一些因素的限制。首先,它使用自己的
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML高级编程上(28)