使用 OASIS CAM (CAMV) 的 XML 验证框架

使用声明式编程方法编写 XML 数据验证规则

本文中,我们将演示一种 XML 验证方法,它使用 OASIS Content Assembly Mechanism (CAM) 模板,支持与使用 B2B 或 B2C 的业务伙伴进行各种复杂消息交换。CAM 模板可简化并形象化验证规则,同时允许网关对不相干的信息直接放行。我们还介绍了使用 Eclipse 和 Java™ 技术构造开源组件来发布所需验证服务的经验。按照实际过程学习应用程序开发流程,其中还有使用 STAR (Standards for Technology in Automotive Retail) Automotive Business Object Document (BOD) 模式和相关 CAM XML 模板的代码片段和 XML 示例。

Puneet Kathuria, 顾问 IT 架构师, WSO2 Inc

Puneet Kathuria 的照片Puneet Kathuria 是 IBM India Ltd 的一名集成架构师。他有 13 年工作经验,主要研究应用程序和集成架构,四年前进入 IBM。



David Webber, 资深架构师, INTEGRITYOne Partners

David Webber 的照片David 目前为美国政府提供 NIEM IEPD 开发咨询,现居住在美国华盛顿特区。David 是 OASIS CAM 技术社区主席,CAM Studio Eclipse 编辑器的合作开发者,主要负责 XSLT 处理脚本。David 具有 30 年行业经验,在 2007 年因 XML 方面的工作成为 ACM 资深委员。David 撰写过 XML 与信息交换优化、OASIS 标准规范方面的多篇文章,在北美、欧洲、亚洲广泛介绍 XML。



Martin Roberts, CAM 开源项目开发人员/设计师, Ontology Systems

Martin Roberts 的照片Martin 居住在英格兰萨福克,在研究 XML、Ontologies、Java、Eclipse 和 Web 解决方案方面有 20 多年工作经验。 Martin 撰写了最初的 OASIS CAM 规范和 CAM Studio Eclipse 编辑器以及 CAMV 验证引擎实现。Martin 曾积极参与欧洲通讯行业的基于 XML 的消息交换和标准方面的工作。他参加过大量行业活动,尤其是 OASIS 赞助的欧洲技术博览会。



2010 年 6 月 01 日

业务和技术挑战

在目前,面临着与大量贸易伙伴用 XML 交换复杂信息和相关大型 XSD 模式的情况,对即将发生的交易进行支持和准确的处理就成为了巨大挑战。目前, XML 模式和 DTD 具有对 XML 文档的结构化内容验证,或者说检验的能力。某些验证规则可以作为 XML 模式的一部分,但不是所有类型的事务验证都可以用 XML 模式或 DTD 来执行。

常用缩略语

  • API: 应用程序编程接口
  • B2B: 企业对企业
  • B2C: 企业对客户
  • DTD: 文档类型定义
  • HTTP: 超文本传输协议
  • JAX-RPC: 基于 XML 远程过程调用的 Java API
  • JDOM: 基于 Java 的文档对象类型
  • J2EE: Java 2 平台,企业版
  • OASIS: 结构化信息标准推动组织
  • UI: 用户界面
  • WSDL: Web 服务描述语言
  • XML: 可扩展标记语言
  • XPath: XML 路径语言
  • XSD: XML 模式定义
  • XSLT: 可扩展样式表语言转换

随着行业规范标准如 Standards for Technology in Automotive Retail (STAR) 的出现,同时也出现大量 XML 模式形式的标准 XML 消息交换格式。Web 服务的用户和提供者都必须遵守这些模式,以通过行业标准组织认证。但这些行业规范模式是由最小验证松散结合的,仅能用于传入 XML 的结构验证。需要额外的代码来实现增加所需模式检查的验证。当那些希望所接收的数据符合特定格式或满足业务内容验证规则的应用程序或组件接收数据时,这些验证可以防止错误发生。

在 Web 服务及其关联 XML 应用程序中实现所需验证逻辑的最常用方法就是编写自定义代码;结果,验证规则隐藏在应用程序中,因此不能轻易修改,记录,或共享。根据所需验证的数量和性质,验证代码可能复杂冗长,而且在越来越多人参与其中后,维护将成为沉重负担。除此之外,每次验证逻辑改变,还将承担将代码重新编译和部署到产品服务器的时间、精力和风险。

除了独立的应用程序,通过 Enterprise Service Bus (ESB) 暴露服务时也需要验证。图 1 演示了一个围绕消息总线的 ESB 的典型架构。该总线提供基于标准如 SOAP、HTTP 和 Java Messaging Service (JMS) 的消息发布。ESB 允许服务基于各自事务服务需求的质量进行交互。它还支持不同标准,如 SOAP、XML、WSDL、JMS、J2EE、JAX-RPC 等。

图 1. 如何在 ESB 架构中执行验证
位于消息用户和消息提供者之间的 ESB 消息层图

开发人员面临的主要挑战是当通过 ESB 交互时,如何在消息提供者与消息用户之间执行消息验证。例如,在 图 1 中,Web 服务组件也许会需要来自现有应用程序的信息。Web 服务(使用者)通过 ESB 向现有应用程序(提供者)发出请求信息。应用程序组件需要请求符合某种格式,且含有正确信息,因此它会在处理前先验证请求。Web 服务组件有自己的一套请求,而且会验证响应信息。如果这两个终端使用不同的协议或标准,ESB 会转换所有消息并在转换消息前执行验证。

每个提供者和使用者都有自己的请求;因此,根据事务类型和验证的数量,这会形成相当长的开发周期,包括定义、创建和测试所有验证。这个稳定化阶段会一直持续,直到每个验证组件都能够对其调用组件的消息验证做出正确回馈。


解决方案描述

此处描述的解决方案的方法是基于 OASIS Content Assembly Mechanism (CAM) 规范实现 XML 验证服务。OASIS CAM 模板方法是基于 XML 内容处理和验证的简单方法,它允许企业创建 XML 格式的通用交换模型。CAM 模板支持基于上下文的规则、代码列表和跨域验证。许多跨域验证不能单独在 XSD 模式下实施;其余情况下,已公布的行业模式不可能包容所有验证变化。

解决方案包含 CAM Studio(基于 Eclipse 的 UI 模板编辑器),它用于定义 CAM 模板。CAMV 验证引擎提供一组开源 Java API,它们用于在运行时用具体编译的 CAM 模板验证 XML。CAM Studio 模板编辑器支持向生成模板中添加自定义 XPath 表达式,不过 UI 可以定义大多数规则,而无需编写自定义表达式。

图 2 显示了开发验证规则生命周期中的建模、编写与测试、部署和监控阶段。

图 2. 验证规则生命周期
开发验证规则的生命周期(建模、编写与测试、部署和监控)图

建模阶段

这一阶段将确认数据条目与数据元素及其对应的验证规则。所需的 XML 交换模式已定义;此外,所需元素将映射到现有行业标准模式,如 STAR (Standards for Technology in Automotive Retail)。

编写与测试阶段

使用 CAM Studio 编辑器来组装或编写 CAM 模板。这是用于创建 CAM 模板的可用的三个编辑器选项:

  1. 从头创建或手工创建
  2. 使用现有 XML 模式
  3. 使用现有 XML 实例

一旦创建 CAM 模板,下一步是审查每一个元素和属性,并制定适用的验证规则。编辑器中的面板显示每个模板节点的规则。图 3 显示的是 CAM 模板编辑器中模板结构的截屏:

图 3. CAM TemplateEditor 中的 CAM 模板
在 CAM 模板编辑器中显示模板结构轮廓的屏幕截图

尽管不是所有验证规则都是二进制位(即,通过或失败),CAM 支持将验证失败划分为警告。这种特性为下列场景带来方便:可以在服务提供者端正常运行的动作,通过修改负载变得可用,而不是拒绝整个消息。例如,某个规则要求注释字段长度在 255 个字符以内;尽管如此,长度超过最大值的消息不应被拒绝,而是应当发送警告给用户将接收前 255 个字符。

在本文的 提示和技巧 一节中将看到设置消息分类警告的细节。

部署阶段

先使用 CAM Studio 编辑器编译 CAM 模板,然后是使用应用程序运行时 CAMV 引擎。编译格式是原来 CAM 模板自身的缩略 XML 版本,并且可用于优化 CAMV 验证引擎的性能。要编译 CAM 模板,选择 Tools > Compile Template 选项。这将生成 .cxx 文件格式的模板,它将会在运行时用到。

CAMV 验证引擎提供简单的开源 Java API,它可用于任何 Java 应用程序,用合适的 CAM 模板验证输入 XML。清单 1 中的代码片段演示了 CAMV 的用法:

清单 1. CAMV API 用法
TemplateValidator tv = new TemplateValidator(templateDocument);
tv.setErrHandler(new ElementErrorHandler(tv));

boolean tvResult = tv.validate(ioReader);

if (tvResult){
        System.out.println("No errors, might be warnings.....");
}

List errList = tv.getErrors();
List warnList = tv.getWarnings();

错误、警告消息格式如下:

<error classification>: <XPATH> => <error or warning message> => Node: <node name> => attribute: <attribute name>

例如,错误消息看上去像这样:

/p:ProcessRepairOrder[1]/p:ApplicationArea[1]/p:CreationDateTime[1]=>Content does not conform to the mask:YYYY-MM-DD'T'HH:MI:SSZ =>Node: CreationDateTime

警告消息看上去像这样:

Warning: /p:ProcessRepairOrder[1]/p:ProcessRepairOrderDataArea[1]/p:RepairOrder[1] /p:RepairOrderHeader[1]/p:OwnerParty[1]/p:SpecifiedPerson[1]/p:ResidenceAddress[1] /p:LineOne[1]=> length should be less than 80 =>Node: LineOne

监控阶段

通过使用 CAMV,可以将所有验证检查外部化而无需将其嵌入代码或使用自定义编码实现。在监控阶段,可以通过简单更新验证模板来满足额外验证的需要。要添加额外验证或移除现有验证,只需重新分配编译过的 CAM 模板(.cxx 文件)。如果发生验证逻辑变化,无需重新编译、重新部署任何 Java 代码。


最新 CAMV 发行版的新特性

最新的(2009 年 12 月)CAMV 发行版中加入的重要特性有:

  1. 除了默认的 Java 1.6,还有向下兼容 Java 1.5 的发行版可供下载。
  2. CAMV 是线程安全的;它可以部署在任何一个 J2EE 容器中,如 WebSphere® Application Server。
  3. 除 JDOM 文档外,CAMV 还能以 StringReader 形式接收 XML 输入,从而在消息处理中减少序列化和反序列化的实例。
  4. 可以在单个 XML 元素或属性中定义多个情况。

提示和技巧

以下是我们在最近的一个项目中总结的提示和技巧,在该项目中,我们使用 CAMV 创建了 B2B 网关验证框架,它用于为一家领先的汽车行业组织公开基于 STAR的 Web 服务。

验证分类

CAMV 支持创建错误和警告消息的验证规则。需要对 XML 元素指定条件 XPath 表达式来详细描述对警告消息的验证。

例如,考虑这样的业务场景,如果某一字段超过规定的 255 个字符的限制,不一定要拒绝 Web 服务请求。业务决策是截断字段长度到 255 个字符,如果它超过,就作为后台系统请求;但必须向调用组件发送警告。

可以通过在 CAM 模板规则中指定 printmessage() 表达式来处理这样的场景。

消息文本必须有前缀 Warning:,后面是所需警告消息,如 length should be less than 255。完整的消息文本像这样:Warning: length should be less than 255

只有当特定元素长度超过指定长度,才会返回警告消息,该规则将会指定为有条件的,并创建 XPath 表达式来执行长度检查,如 图 4 所示,该图为 CAM Studio 编辑器表达式条目向导工具屏幕截图:

图 4. 如何配置警告规则
检查 255 个字符长度的警告消息规则的屏幕截图

缓存 CAMV 模板

可以将 CAMV 模板缓存到内存中来执行重复验证,而不需要每次执行验证时从硬盘读取模板。这会减少磁盘 I/O 并显著提升性能和吞吐量。

验证错误检查

即使返回警告,CAMV Java 方法 TemplateValidator.validate(..) 还是返回 true。只有返回错误时,它才置为 false。因此,当返回警告时,使用 getWarnings() 方法来获取所有警告消息列表。

验证消息

如果返回的消息(它包含 XPath 路径、验证消息和节点名称)不满足业务场景,需要更多信息,客户端应用程序可以创建自定义代码。CAMV 在向输入交换消息 XML 添加 CAMERROR 和 CAMWARN 属性后,添加相同的输入 XML,如 清单 2 所示。

清单 2. 执行验证后修改的 XML
<p:ApplicationArea>
<p:Sender>
<p:CreatorNameCode>CNV</p:CreatorNameCode>
<p:SenderNameCode>SNC</p:SenderNameCode>
</p:Sender>
<p:CreationDateTime CAMERROR="CreationDateTime | Content does not conform to the
mask:YYYY-MM-DD'T'HH:MI:SSZ">2001-12-31T12:00:00</p:CreationDateTime>
<p:Destination/>
</p:ApplicationArea>

<p:ResidenceAddress>
<p:LineOne CAMWARN="WARNING:LineOne |  length should be less than 80">100 Moon Drive 
100 Moon Drive 100 Moon Drive 100 Moon Drive 100 Moon Drive 100 Moon Drive</p:LineOne>
<p:LineTwo>APT # 100</p:LineTwo>
<p:CityName>MALIBU</p:CityName>
<p:CountryID>US</p:CountryID>
<p:Postcode>99999</p:Postcode>
<p:StateOrProvinceCountrySub-DivisionID>CA</p:StateOrProvinceCountrySub-DivisionID>
</p:ResidenceAddress>

通配符表达式

当在模板中输入规则时,XPath 验证表达式指定为(默认情况下)使用两个斜杠(//)的通配符表达式,它在文档中从现有节点选择符合的所有节点,而无论节点位于何处。

图 5. 如何在定义规则时指定通配符表达式
使用两个斜杠(通配符值)的 XPath 表达式规则的屏幕截图

这会导致规则应用到特定元素的所有实例中(请注意:对于特定元素的其他实例,规则不会立刻可见,在 CAM 模板编辑器视图中刷新后才可见)。

尽管如此,如果需要将检查应用到 XML 元素的特定实例,建议在 Rule XPath 复选框选择 Full

图 6. 如何在定义规则时指定显式表达式
Screen capture of a rule with an 显式 XPath 表达式规则的屏幕截屏

结束语

使用 CAMV,可以执行一致的验证检查并快速改变规则来调整消息处理以符合特定合作伙伴交换和内容。通过外部化以前深嵌在后台应用程序代码中的验证规则,可以对更具预测性的消息处理进行控制和管理。这些基于标准的规则模板可以有选择地与合作伙伴分享,从而更加促进系统内容处理的一致性。

有了更具灵活性和容错性的流程,应用程序可以处理更多的内容变化,从而,轻松支持广泛的交互合作伙伴,同时降低支持和维护成本 — 这与通常的经验相反。

开源的使用极大促进了开发解决方案与将 CAMV 引擎集成到部署环境的融合。

总而言之,该项目展示出,XML 的创新使用和动态可配置 XML 可以提供比单独依赖静态编译代码源更好的、更稳定的、更快的、功能更强的用户应用程序体验。


下载

描述名字大小
使用 CAMV Java APIs 的样例 Java 项目ValidationFrameworkSample.zip2032KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Java technology
ArticleID=493808
ArticleTitle= 使用 OASIS CAM (CAMV) 的 XML 验证框架
publish-date=06012010