鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站制作教程 > XML/RSS > >

使用CAM机制提高XML验证水平(1)

来源:互联网 作者:佚名 时间:2015-03-02 14:50
【51CTO独家特稿】CAM即内容装配机制(Content Assembly Mechanism),它是一个XML结构验证方法,由于它是一个新生事物,文档很少,因此本文就当扫盲了。 XML文档的验证需要确认文档是完整的,并且符合在文档类型定义(Document Type Definition 即DTD)中指

【51CTO独家特稿】CAM即内容装配机制(Content Assembly Mechanism),它是一个XML结构验证方法,由于它是一个新生事物,文档很少,因此本文就当扫盲了。

XML文档的验证需要确认文档是完整的,并且符合在文档类型定义(Document Type Definition 即DTD)中指定的规则,DTD是最早的规范说明方法,它提供了有用但有限的功能来验证XML文档结构,但只有一点语义;接着出现了XML Schema,它提供了更多灵活性和功能,增强了对结构的支持,并且很好地支持了语义,Schematron,RelaxNG已经尝试提升对语义的支持,但都没有取得什么进展;现在一种全新的技术在OASIS的保护下开发出来了,它就是CAM。

CAM不仅是一门schema语言,其设计目的是更好地满足业务交流和互操作性要求,它提供了强有力的机制来验证XML结构和语义,使其简洁、易于使用和易于维护;它提供了一个上下文机制 -- 一种基于XML自身其它部分或外部参数来动态调整那些应被视为有效的XML实例。

CAM是一个令人兴奋的技术,它的未来充满希望,但它是一个新技术,可能有好有坏;CAM的开发非常迅速,因此在本文中,你可能会发现很多‘在写本文的时候’的字眼。开发团队也很勤奋,你反馈的问题可能很快就会得到修复,而且有些问题可能你还没有发现就已经被修复了。

因此,在写本文的时候,CAM文档还很潦草:有一个正式的规范,一份白皮书,一份PowerPoint演示文稿和一些简要介绍了编辑器和API的网页。还没有明确的指导和教程,本文的目标就是:“CAM:缺少的手册”,扩大CAM文档阵营。

你需要

◆基本上熟悉XPath,CAM大量使用了Xpath定义业务规则,请参考w3School的Xpath教程温习一下。

◆基本上熟悉XML Schema,虽然本文表面上看起来是XML Schema的继承,因为它广泛地依赖于与XML Schema的对比,作为最有效的沟通方法,请参考w3School的XML Schema教程温习一下。

规定合法XML

XML文档是元素的多层次组合,它是一个用于存储任何数量文字或数据结构的树状存储结构,XML文档需要很好的格式,这意味着它只有一个根,其元素和属性必须符合简单的XML语法规则,在XML没有映射到特定的问题域(如数学、书籍协作或金融交易)之前,它都没什么用处,这种映射将抽象的XML区域以一种专业XML语言与你的特定问题对应起来,任何专用语义都必须事先定义好,否则就会被认为是无效的,遭到拒绝。

思考一下下面的顾客地址:

﹤address﹥
﹤address_street﹥221B Baker Street﹤/address_street﹥
. . .
﹤/address﹥

为了在XML Schema中验证这个XML片段,你通常会定义一个如下的结构:

﹤xs:element name="address"/﹥
. . .
﹤xs:element name="address_street" type="xs:string"/﹥
. . .
﹤/xs:element﹥

这些限制条件指出﹤address_street﹥元素必须存在,并且必须包含在﹤address﹥元素内,还必须包含一个字符串。对于一个地址而言,一个简单的字符串值可能是适当的,但其它字段你应该使用更具体的东西,要么是一个专门的字符串(一种衍生的,有限制的字符串)、日期、整数或其它定义类型。
XML Schema是一种基于语法的系统,在它里面你需要同时为语义和结构定义语法;另一方面,Schematron是一个基于规则的系统,你可以使用规则同时指定语义和结构,即你不仅使用规则指定address_street是一个字符串,还用规则指定﹤address_street﹥必须显示在﹤address﹥元素内,XML Schema和Schematron从根本上说语义和结构都是纠缠在一起的。在编程方面耦合度很高,这是不可取的。
相比之下,CAM是一个混合系统,它将结构从语义中独立出来(低耦合),使用规则指定语义,例如address示例看起来象:

﹤as:Structure﹥
﹤address﹥
﹤address_street﹥%street number and name%﹤/address_street﹥
. . .
﹤/address﹥
﹤/as:Structure﹥
﹤as:Rules﹥
﹤as:constraint action="datatype(//address_street,string)" /﹥
﹤/as:Rules﹥

CAM模板的﹤as:Structure﹥小节定义了XML文档的层次结构,实际上它是从XML文档示例复制过来的,只不过将真实数据替换成占位符(以百分号标志出来)而已,因此前面的CAM模板表示是一个使用%street number and number%占位符替换真实数据的XML实例。
﹤as:Structure﹥小节补充了部分语义,它定义了一个元素包含了哪些其他元素,以及顺序,和Schematron不一样,你不需要费力地编写规则代码定义结构,CAM以所见即所得的形式指定结构,而Schematron不得不自己动手写代码,就和使用微软Word字处理软件一样方便,所见即所得形式相对使用RTF文本生成Word文档而言,编写RTF实在是太乏味、太困难了,而且容易犯错,如图1所示。

图1
图1

所见即所得示例,微软Word使用更直观的形式编辑文档(左侧),但这两种方式实际上都在完成同一件事情
即使有一些很酷的工具如XmlSpy或Liquid XML Studio可以帮助你实现所见即所得的感觉,XML Schema也不是所见即所得的,思考一下下面的示例代码,它定义了一个cost,范围在1-999,保留2位小数。

﹤xs:element name="cost"﹥
﹤xs:simpleType﹥
﹤xs:restriction base="xs:decimal"﹥
﹤xs:fractionDigits value="2" /﹥
﹤xs:totalDigits value="5" /﹥
﹤xs:minInclusive value="1" /﹥
﹤xs:maxInclusive value="999" /﹥
﹤/xs:restriction﹥
﹤/xs:simpleType﹥
﹤/xs:element﹥

下面显示的两个CAM语法是等同的:

﹤as:constraint action="setNumberMask(//Part/cost,###.##)" /﹥
﹤as:constraint action="setNumberRange(//Part/cost,1-999)" /﹥

CAM模板的﹤as:Rules﹥小节定义了在﹤as:Structure﹥小节中明确嵌入的语义之外的所有语义,包括数据类型、约束、基数、条件等。

CAM的优势

表1总结了相对于XML Schema和DTD,CAM的关键优势,表这每行将会在本文后面介绍,或以后的文章中介绍。

表1

序号 项目 DTD XML Schema CAM 示例/注释
1 隔离结构和业务规则  
2 当前节点固定验证 ﹤quantity﹥将一个整数固定在1到100之间
3 当前节点条件验证 受限的 ﹤zip﹥必须是5位数或10位数
4 跨节点条件验证 受限的 如果﹤state﹥是FL,NV,SD,TX,WA,WY,NH或TN,﹤taxable﹥必须是no,否则就是yes
5 上下文机制 依赖于条件A或B是否符合
6 结构可变性 订购数量超过25kg的顾客必须选择一种物流运送方式
7 参数化引用 从加拿大采购必须符合条件x、y和z,从新西兰订购必须符合条件a、b和c
8 命名空间感知  
9 定义自己的数据类型 不行 可以 可以 ﹤bookNumber﹥必须是8位字符串
10 语法和文档一样 不行 可以 可以  
11 代码重用 受限的 可以 可以 ﹤shipTo﹥和﹤billTo﹥地址包含相同的验证规则
12 工具/编辑器 1  
13 图形化设计器 使用XML Schema设计器时可以设计出复杂的结构
14 所见即所得 使用扩展框架 使用扩展框架 固有的 业务规则语句和它们执行时几乎是一致的,真正做到了按原文所见即所得,
15 采用情况 成熟 成熟 初生婴儿 成熟的稳定性更好,支持也多
16 API Java、Perl、Ruby、.Net Java、Perl、Ruby、.Net Java  
17 开放标准  

表 1 重要的验证特性,DTD,XML Schema和CAM对比表

网友评论
<