返回首页
当前位置: 主页 > 航空资料 > 计算机 >

XML高级编程上(73)

时间:2010-08-09 13:05来源:蓝天飞行翻译 作者:admin 点击:
  
D T D下不被允许。我希望已经告诉你了命名空间是有用的。验证也是有用的。使二者一致就是
200使用XML 高级编程
下载
XML 模式的好处之一。
7.5 模式
第一件要弄清楚的事是D T D实际上是一种模式。但是当X M L领域里的人们提及模式时,他
们通常是指用X M L语法写成的D T D替代物,是一个我们在这一章用过的术语。这里对于D T D有
很多可供选择的提议,并且W 3 C组织当前正致力于从这些工作中建立一个标准的可以选择的绘
图灵感。在某种意义上,我们可以把模式想象为一种强制机制,其中定义了允许的元素、属性
等等,我们正在约束使用者选择标记和他们的内容模型。
通常,我们能够把模式说成元数据或关于数据的数据,并且当我们快要明白一些模式的成
果不止参与定义词汇表时,它们早就开始去解释特定类型数据的关系。
如果你想要替换D T D,需要具备至少与他们相同的能力。你需要描述X M L文档的自然状态
和结构。就像D T D,一个模式是X M L词汇表组建和规则的描述。模式靠许可在表达一些词汇表
概念有更高的精度细化了D T D。并且模式做了一些大幅度的改变。它们使用了完全不同于D T D
的语法。它们允许我们去借用其他的模式,而且解决了你在最后的命名空间例子里遇到的问题。
它们提供了元素和属性的数据类型。整个模式实际上对于描述词汇表问题是个更好的答案。
X M L与D T D结合得很好。与此同时,在改进它们的问题上有很大的兴趣。这种兴趣包括多
种形式,其中有各种已被采纳的建议(其中几种可从注解中的W 3 C站点得到)。当这些成为工作
中重要的一部分时,这也推迟了一个涉及多个最普遍的模式急需特征的推荐标准的采纳。特别
是,许多开发者想要很强的分类能力去验证多个命名空间,并在一些时候使用X M L语法。幸运
的是,这种状况已经被解决。在写这本书的时候( 2 0 0 0年1月),关于模式的W 3 C工作组在使许
多对模式语言有贡献的建议合成一个有用的描述上做得很好。改进的模式给X M L文档自动交换
数据带来很大的益处。
7.5.1 与DTD有关的问题
你可能在学习D T D语法和规则上投入了很大的精力,并且缺少模式描述不能阻止你探索许
多X M L的好处和研究许多有趣的例子。因此你可能奇怪D T D出了什么问题,以至于你必须学习
一种新的方法。首先,学习D T D非常值得,这是因为(在写的时候)它们对于描述你自己的标
记只提供了一种标准。并且,有许多用D T D定义过的标志语言,读懂它们对于采纳标志非常有
帮助。
但是,正如我们在第3章里建议的,D T D有几个缺点,并且当我们试着用X M L做更多的事情
时,这些缺点会变得更加明显。
• 它们很难写及理解。
• 它们的元数据在程序处理时非常困难。
• 它们不可扩展。
• 它们不对命名空间提供支持。
• 它们不支持数据类型。
• 它们不支持继承。
第7章命名空间和模式使用201 下载
让我们按顺序看一下每个问题。
1. DTD很难写及理解
比起XML ,D T D使用一种语法,即Extended Backus Naur Form(EBNF),并且许多人发现它
很难阅读和使用。而被提议的XML 模式实际上使用了X M L去描述它们定义的语言,在学会读、
写它们之前去掉了学习E B N F的困难。
2. 程序处理元数据非常困难
使用E B N F也使在D T D里自动处理元数据非常困难。这里当然是指D T D的解析器。你可能已
经有了一个;它是你偏爱的经过限定的解析器。经过限定的解析器在它们能够验证一个适合的
文档之前必须装载和读入D T D。但是不可能从一个程序使用D O M去探究D T D。D O M不能提供访
问用E B N F写成的词汇表元数据。你的验证过的解析器读了D T D并保护它的信息的完整。如果
D T D用X M L写成,而我们能够像研究根据规则写成的文档那样研究它们,这不是很好吗?这个
特性将允许我们使用D O M去调查新遇到的词汇表结构或者甚至为了验证依据运行时的条件修改
一个词汇表的规则。
3. DTD不可扩展并且不对命名空间提供支持
正如我们在命名空间检测看到的,一个D T D是i t。一个词汇表里所有的规则必须存在于D T D。
你将需要的每一件事放入D T D,并且你与它们同在。你不能不建立扩展实体而从其他源借用。
既然写了c a t a l o g . d t d文件,你应该想要在代码上加一个新的部分,为了新的< r e l e a s e D a t e >元
素,整个D T D将要必须重写。即便你通过拷贝和粘贴其中的大部分来实现这些,你必须小心地
确定现有的文档仍然有效。
进一步讲,创建并维护你自己的标记声明的子集并不像简单地引用现有的定义那样灵活。
你不能允许文档作者在后面包含一些有趣的而在D T D里没有发现的东西。当然,我们并不是经
常给文档作者这么大的自由度,但当设计一个新词汇表时给出一个选项,即可以利用现有模式
的一部分,那将变得非常好。
还有,因为一个词汇表里所有的规则必须存在于D T D,如我们所看到的,你不能混合命名
空间。虽然你能使用一个命名空间去将元素类型引入一个文档,你不能使用命名空间去查阅一
个D T D里的元素声明。如果一个命名空间使用了这个命名空间的所有元素,它必须在D T D里声
明。
4. DTD不支持数据类型
X M L最强劲的地方是各个文档完全用一个通用的数据类型-文本写成。当我们写程序时,经
常需要谈论类型而不是文本。比起文本, D T D没提供几种数据类型,当我们在特定类型的应用
程序里使用X M L时,这是一个非常严重的缺陷。
因为D T D提供无标准的机制去包含无文本类型的我们标记的数据,这意味着我们必须暗中
共享有关数据类型的信息,在解析文档时为我们自己执行转换。比如我们想要完成一些在数字
元素内容上的循环,在应用能够被希望处理这些数据之前,必须要将文本转换成合适的数据类
型。
5. DTD不支持数据继承
采用D T D没有办法表达继承,于是你设想一下,我们有一个称为“ b o o k s”的类,这里没有
 
中国航空网 www.aero.cn
民航翻译 www.aviation.cn
本文链接地址:XML高级编程上(73)
 
------分隔线----------------------------