级别: 初级 Benoit Marchal (bmarchal@pineapplesoft.com), 顾问, Pineapplesoft
2004 年 1 月 01 日 许多应用程序正在进行升级以适应电子商务交易。关于这个主题的前两篇文章中,Benoit Marchal 介绍了一种简易的实现方法:从大多数业务应用程序已经生成的导出文件中创建 XML 交易。他介绍了在小型公司中部署这种解决方案的经验。请您在本文的讨论论坛 上与作者及其他读者交流您的想法。
有多少次您遇到过这种情形?
开发人员:“那么数量总是存储在
OQTY 字段中?”
管理员:“当然,从那里取就是了。”
开发人员:(后来)“您能帮帮我吗?这些行里怎么没有数量?”
管理员:“噢,天哪!那只是一个例外。那是从工厂来的,他们使用不同的系统。”
欢迎来到奇妙的数据映射世界,这里的每条规则都有例外。这篇文章是
使用 XML专栏中“轻量级 XML 客户机”系列文章的一部分。以前的部分集中讨论了 Java 编程、API 以及创建这种客户机可以使用的工具。
上一篇文章中已经介绍了这个轻量级客户机的第一个版本 —— 客户机使用样式表和 XI 准备并发送 XML 交易 —— 在本文中,我将展示如何编写样式表。
一些背景知识
如果您没有看过本系列中以前的文章,让我再强调一下该项目的特殊偏向:满足简单的需要的一种单纯的解决方案。您可以找到许多杰出的高端 XML 服务器 —— 有商业化的(如 IBM WebSphere),也有开放源代码的。这类产品在电子商务或者企业应用程序集成(eAI)中,处理大量的 XML 交易时非常优秀。
该项目的目的是用一个不那么重要的客户机作为 B2B 电子商务服务器的补充。B2B 电子商务越来越多地采用 XML 交易的形式 —— 订购商品一般需要发送 XML 消息到厂商的 XML 服务器。厂商提供货物(至少
希望如此),但也可能用一些 XML 消息答复,比如提供信息、订单状态,最后还有发票。
部署这样的一个系统,显然需要双方(买主和厂商)必须能够准备和处理 XML 交易。他们该怎么做呢?当然是在两头都安装上一个 XML 服务器。
错误的答案!
并非每个组织都有能力安装和维护一个 XML 服务器,即使他们确实可以从 B2B 电子商务支持中获益。简而言之,服务器的维护太复杂了,成本也太高,除非公司期望处理非常多的交易。考虑以下情形:
- 我是从保险业务开始我的职业生涯的。多数独立的代理(至少在比利时)都是很小的生意,无力支付运行复杂软件的成本。但是如果能够以电子方式处理新的合同和索赔,他们仍然可以从中获得很大的好处。这样可以提高他们的竞争力(更快的服务、更优质的答复、新的产品),也降低了保险公司的成本,最终转化为更高的利润和价格谈判时更大的余地。
- 许多其他行业也存在类似的情况:金融部门、不动产、报摊、独立书商、法律服务、卫生保健等等。许多行业都面临着向自营职业者部署 B2B 电子商务的问题。
- 这种情况也同样适用于电子政务。政府需要收集大量的信息,但是负责提供这些信息的机关或单位不一定能够处理 XML 交易。
- 这种情况发生在老套的电子商务案例中 —— 买主/卖主的关系。其中的一个伙伴可能是一较小公司,没有财力运行复杂的 XML 软件。部署 B2B 电子商务策略的公司常常发现他们很快可以和大约 20 家公司签约,然后一切努力都搁浅了,因为其他的伙伴不同意一种复杂的解决方案。
基本上,无论什么时候在合作伙伴规模不同的环境中部署 B2B 电子商务解决方案,都会面临着为较小的伙伴寻找适当工具的问题(我已经谈到,为大型的伙伴寻找高端工具要相对容易一些),这最终引起了我对 SOAP 的兴趣。早期的远程过程调用(RPC)是基于一种编程模型的,开发人员编写专门的过程调用。SOAP 也支持那个模型,但是它在传输中使用的是 XML,这意味着任何能够生成 XML 的工具都可用于准备交易。
更具体地讲,在这个轻量级 XML 客户机的例子中,通过 XI(本专栏中的另一个项目 —— 请参阅
参考资料)和 XSLT 的结合,能够把数据导出到文本文件的任何工具都可以准备 SOAP 交易。从我的经验来看,多数小型企业使用的业务管理工具都能导出文本文件,也可能仅仅是集成到一个办公软件包中。轻量级 XML 客户机就利用了这种方法。
敢于怀疑
不同的应用程序以不同的格式导出数据,因此需要做一些工作为 SOAP 交易重新组织数据。这个过程称为
数据映射,因为您是把导出文件中的信息映射到 XML 文档中。不幸的是,应设对于每个应用程序都是不同的。
在一个最近的项目中,我的公司在数百个办公地点部署了类似的轻量级 XML 客户机。我们发现映射对每个业务管理应用程序都是专门的。所幸的是,这种映射非常简单,一小组初级程序员经过非常少的 XSLT 培训后就足以应付。多数情况下它们可以在一天或更短的时间内准备好一个映射。因此,这种代价对用户是可以接受的。
通常,业务管理应用程序很少描述它的导出文件。这就是忠告:“敢于怀疑”。假设文档不完整或者已经过期了(可能是这样),那么反复试验就是成功的良方。
为了说明如何为这个轻量级客户机建立映射,我已经结合实际项目中的元素准备了一个典型的案例。这家小型企业使用两个市场上出售的应用程序管理订单,程序运行在一台 IBM eServer (以前称为 AS/400)上。每天,它都把两个应用程序中的新订单合并到一个文件中,发送到一台 Windows 工作站上,在那里一个秘书将它们导入一个桌面出版工具包打印(每周大约有 20 到 50 个订单)。尽管不是最直观的结构,但至少有一个导出文件可供轻量级客户机使用。
SOAP 服务器
首先让我们看一看目标是什么。交易是为部署在一台 AXIS 1.1 上的 SOAP 服务器准备的。这个服务器有一个方法,
processOrder() ,它需要一个
Order 对象数组。
Order 对象由图 1 中所示的 UML 定义:
图 1. SOAP 数据模型
导出文件
现在让我们看看您从 eServer 中得到了什么。表 1 显示了从客户收到的文档:
表 1. 导出文件格式
|
字段
|
长度
|
说明
| | HDR_OTYP | 3 | “HDR”表示头记录 | | HDR_ORFF | 5 | 订单引用 | | HDR_ODTE | 8 | 订单日期 | | HDR_ODTC | 8 | 创建订单的日期 | | HDR_OTOT | 9 | 订单总价值 | | LIN_OTYP | 3 | “LIN”表示行记录 | | LIN_ODEP | 3 | 部门代码 | | LIN_ORFF | 5 | 订单引用 | | LIN_OCOD | 5 | 产品饮用 | | LIN_OFI1 | 5 | 未用 | | LIN_ODES | 35 | 描述 | | LIN_OQTY | 2 | 数量 | | LIN_OPRI | 9 | 产品价格 |
基本上还要要求(或者取得)其他一些示例文件。同样,这里的描述也可能是不完整或不精确的。
从描述来看,很清楚导出文件中包含两个记录类型:HDR 和 LIN。HDR 记录包含头部信息(如订单引用),而 LIN 记录包含产品的描述。显然,每个订单最多只能有一个 HDR 记录,但是订单中有多少产品就有多少 LIN 记录。这种带有两种记录的结构在订单文件中是很常见的。
映射分析
现在侦探工作开始了。下一步是比较导出文件和 SOAP 定义。目的是记录下两种定义之间不一致的地方。在这个例子中,通过分析发现:
- 导出文件中有两个日期,而 SOAP 服务器中只有一个。
- 日期是 8 个字符长,因此推测不适合用
xsd:date 表示。
- SOAP 服务器不需要部门代码。
- 需要检查“未用”字段。
- 没有找到买主和地址。
进一步的分析有几种选择:研究示例文件、会见用户、创建测试案例,或者 —— 在最好的情况下 —— 和应用程序开发人员交谈。当然,很少有机会与应用程序开发人员交谈,但是用户可以提供大量的信息,因为他能够识别输出文档中的字段,并可以解释文档是如何准备的。
个别情况下,您可能必须创建一个测试案例 —— 用常见的值伪造文档。通过导出这些值并在导出结果中查找它们,您可以记录下每个字段所起的作用。清单
1 是一个示例导出文件:
清单 1. 示例导出文件
HDRAZ5251029200309252003 1899.00
HDRAZ5281029200310272003 149.95
LINWEBAZ525THPRE IBM ThinkPad R Series Economy 1099.00
LINDITAZ525THPRV IBM ThinkPad R Series Value 2 400.00
LINWEBAZ528BKXBE XML by Example 5 29.99
|
通过检查这个文件并和用户交流,情况比较清楚了:
- 订单创建日期和部门代码仅供内部使用。
- “未用”字段总是空的,因此可能是以前的应用程序留下来的,完全可以忽略。
- 数量字段可能不含任何数据。进一步的测试发现,当只订购一种产品时,
前述的两个应用程序之一会产生空字段。
- 买主和地址是不变的,即示例公司的名称和地址。
很少出现映射分析发现缺失信息的情况 —— 即服务器需要的信息既不在导出文件中,也不是一个常量。这是因为业务关系阻碍了电子商务系统。换句话说,两个业务伙伴已经进行了多年的交易,因此他们已经存储和处理了需要的所有信息。这种轻量级客户机只不过是以新颖的方式利用这些信息。
表 2 总结了上述映射分析,并指明如何把导出文件转换成 SOAP 请求:
表 2. 分析总结
|
SOAP 元素
|
导出字段
|
注释
| | Order/Reference | HDR_ORFF | - | | Order/Date | HDR_ODTE | 转换成 xsd:date 格式 | | Order/Buyer | - | “Example Corp.” | | Order/Address | - | “Example Street 5, 45202 Cincinnati, OH” | | Order/Total | HDR_OTOT | - | | Item/Code | LIN_OCOD | - | | Item/Description | LIN_ODES | - | | Item/Price | LIN_OPRI | - | | Item/Quantity | LIN_OQTY | 如果没有则为 1 |
处理遗留数据
新设计的应用程序完全支持 XML,但是所有现存的应用程序转换完成还需要几年的时间。在这期间您能做什么呢?一种有利可图的方法是利用附件(比如这种轻量级 XML 客户机),在已有应用程序功能上建立对 XML 的支持。
这种方法对于商业很有吸引力,因为它提供了一种向新的服务如电子商务的迁移途径。对于开发人员来说不幸的是,这常常意味着要处理过去的、编档不完善的文件格式。对这些文档的广泛分析是成功的唯一保证。
在本文的第 2 部分,我将展示如何把这种分析转化成实际的 XSLT 样式表,用以准备 SOAP 请求。
参考资料
关于作者
对本文的评价
|