当前位置: 首页 > 图文教程 > XML家族 > XML Schema > Schema之战:XML Schema vs. RELAX NG
Schema之战:XML Schema vs. RELAX NG
最近,围绕XML又引发了一场不小的争论,业界对于究竟哪个——XML Schema还是RELAX NG——才是取代另人望而生畏的DTD的最合适工具莫衷一是。与此同时,由于Internet工程任务组IETF正在着手制定一个XML使用标准RFC on the use of XML,因此,有关Schema标准的话题自然也成了争论的焦点之一。
XML Schema是W3C(万维网联盟)于2001年正式推荐使用的“XML规范标记语言”。规范标记语言旨在定义与数据的属性和类型等相关的规范(SCHEMER)。所起作用是规定不同企业间进行数据交换时,各种数据所代表的意义。在XML规范标记中最早使用的是DTD(Data Tag Definition)。但DTD存在下列几个明显的缺陷:
1) DTD本身并不遵循XML标准,其语法定义与XML不同,且复杂古怪。这就要求XML文档的编写者必须在XML外,学习和掌握DTD标记写法;另外,程序中还需要多一道语法分析过程。
2) 可定义的数据类型太少,而且数据类型和数据格式的定义无法做到与编程语言之间的自动映射。
3) 不支持名称空间,易与标记名发生冲突。
为了弥补上述缺点,各种规范标记语言纷纷出台,这些提案中包括微软制定的XDR(XML Data Reduced)、XML Schema以及日本标准RELAX NG等。
James Clark——OASIS RELAX NG技术委员会领导人,也是第一个XML语法分析器的作者之一,最近在XML技术讨论组newsgroup posting中撰文,分析当前XML Schema存在的如下种种问题,由此引发了一场XML Schema和RELAX NG之争:
1. 定义XML Schema需要相当高的专业技能,而且还可能会遇到一些意想不到的问题。
例如:当使用restriction来派生一个复杂类型时,必须将新的被限定的内容模式(content model)声明得非常明确;而其属性的处理方式却又恰恰与此相反:缺省情况下,派生类型自动获得基类型的所有属性,只有对不需要的属性才必须明确加以排除。类似的不一致性还表现在:当合并两个属性定义时,得到的是属性定义的合集而非由anyAttribute元素声明的属性交集。这些小地方对于规范的制定来说或许是种方便,但却容易给XML Schema的阅读者造成困扰。
2. XML Schema建议书既不易读且难懂。
在实际工作中,为了充分理解某个XML Schema定义,避免上述提到的可能的曲解,或许有开发者会考虑参阅规范建议书。但不幸的是,W3C的XML Schema建议书可以说是迄今为止最难读懂的一本规范文本了,读过之后,你可能更难搞清某个特定的Schema定义的含义。
3. XML Schema对于属性的支持不比DTD好得了多少。
与DTD差不多,XML Schema仅允许声明属性是必须的还是可选的,而无法对属性之间或属性与元素之间定义更复杂的约束关系,例如在属性X或属性Y中任取其一;或在属性X或元素Y之间任取其一等。约束机制只存在于同时出现的子元素之间是XML Schema的缺陷之一,事实上,将这种约束机制扩展到属性之间以及属性与子元素之间是完全应该且十分必要的。
4. W3C XML Schema对无序内容的支持很弱。
由于这个局限性,当XML词汇表的设计者不希望子元素出现在某一特定序列中时,几乎无法XML Schema来描述XML词汇表。
5. W3C XML Schema数据类型的处理缺乏模块性。
XML Schema数据类型定义在W3C XML Schema的第二部分中。这是一个非常特别的数据类型集,一方面它包括某些相当有争议性的数据类型(如gYearMonth, gDay等),另一方面又缺乏对许多应用来说非常重要的数据类型。因此Clark在文建议采用模块化方法来解决这个问题,使Schema语言能和一个或多个标准数据类型集——如通用数据类型集或某些为特殊行业定制的数据类型集——相结合,以满足不同场合的需要。
6. W3C XML Schema无法用schema对XML文档进行唯一的有效性验证。
XML Schema存在多种松紧度不同的有效性约束。同一个schema可以以不同的方式对文档进行有效性检查,以至于我们无法确知一个的有效的文档到底应该是什么样的。例如,在XML Schema中,无法确切标定到底有哪些可以用来做为根元素。
7. 另人困惑的schema属性。
W3C XML Schema提供xsi:schemaLocation属性,该属性允许XML文档自行指定一个对其进行有效性检查的schema。然而这可能引起诸多问题,如不利于安全(目的schema可能已经被修改或是伪造的)、缺乏互操作性(schemaLocation属性是可选的)和影响schema定义的“纯洁性”。由于无法完全防止文档中包含另人困惑的xsi:* 属性,因此在W3C XML Schema中出现语法的歧义现象也就在所难免了。
8. W3C XML Schema中另一个存在问题的地方是对信息集合infoset变动的支持,如允许信息的缺省属性发生变化等。
这种支持,除了有悖于模块化设计原则外,还可能引发互操作性问题。因为这有可能导致应用程序在有效性检查执行前后从信息集合infoset中获取的信息不一致。
鉴于XML Schema存在的上述种种问题,Clark提议业界更多地考虑由他领导设计的RELAX NG。RELAX NG融合了村田真开发的RELAX和Clark设计的TREX,是DTD的一个简单而优秀的演进版本,它强调易用性、模块化和有效性验证。它在有效性检查过程中不会造成对infoset的修改,从而可以避免出现上述提及的XML Schema诸多问题。目前RELAX NG也是ISO的一个标准草案(ISO/IEC DIS 19757-2)。
针对上述归纳出的XML Schema问题,RELAX NG提供如下改进:
1. 定义简明
2. 规范建议书更易读
3. 提供元素和属性之间的类语法约束声明
4. 提供“&”操作符标示无序内容
5. 数据类型不作为RELAX NG的组成部分,但可以以模块化的方式指定加入
6. 根元素定义精确
7. 文档中不包含涉及指定schema的内容
8. 在有效性检查过程中,不会改变一个文档的信息集合infoset
RELAX NG中的schema可以用XML格式书写,也提供对非XML语法的支持,这有点类似于上下文无关文法。RELAX NG中的非XML语法易于理解,但需要额外的语法分析器。
结论
Internet工程任务组IETF正在制定的XML使用标准以及它对XML Schema使用的推荐在XML业界引起了一定程度的抵制。RFC 2026 1.2小节中指出,Internet标准化过程中有两个目标:一是技术上的优异;二是文档的清晰、简明和易于理解。Clark 正是针对这两点对XML Schema标准进行发难的,在文中他最后邀请每一位与他持不同见解者都来对RELAX规范和XML Schema规范做一认真比较。
评论 (0) All