您的位置:首页>软件开发>软件工程>系统分析设计>

在当今使用XML解决真正的商业问题

[ 来源:Sawin 软件研发之窗 | 更新日期:2007-7-15 20:17:55 | 评论 0 条 | 我要投稿 ]

商业问题

  XML的力量存在于它的“eXtensibility 可扩展性(译注:XML的全称是eXtensible Markup Language)”...但是这也能证明这是很多组织所难于克服的障碍。

  在这个案例中,我们的电子商务网站是在两个不同的伙伴之间外包某种类型订单的履行业务。一个通常的情况是,这两者都想要订单是同一种XML格式,但两种格式就是有着非常大的不同。此外,伙伴B需要我们将XML订单文件放在FTP目录中的同时,伙伴A要求将XML直接发送到他们的服务器上。从那里,他们能获得数据。

所以就有如下三个挑战:

一、我们不得不自动发送订单数据到外部的服务器
二、我们不得不为每个伙伴准备不同的数据格式
三、并且,我们将使用不同的方法传送数据


这真的不好

  不久就会有各种各样的系统被放置于这个任务中。解决方案 ,诸如BizTalk 、SOAP和SQL 2000会加进许多。BizTalk还不可用。SOAP也不会有什么帮助,而且,使用SOAP需要双方签订协议统一使用它。再有,SQL 2000会使我们很容易生成从订单数据库中生成XML.说这些系统会工作在一起只是对将来的承诺,而作为一个开发者,我们今天需要理解一些技巧。

字串7


  尽管,我们并未准备好使用任何这些解决方案。在以某种方式设计我们的应用时,对我们感觉有能力地方的着手一试,还是值得的。

解决方案

  这篇文章将讨论使用VB、SQL Server 7.0、XML和XSL(译注:XSL是可扩展样式表语言,全称是 eXtensible Stylesheet Language)建立一个健壮的和灵活的伙伴间订单处理系统以适应当前的需求,并且自身是可扩展的。

  此处理过程包括以下三个独立的步骤。(为了演示的方便,所有步骤都包括在一个可执行文件中)

步骤一:建立内部的XML订单文档 在第一步中,系统从 SQL 服务器的数据中建立XML文档。内部XML文档位于内部发信信箱中。
步骤二:建立待发送的订单XML文档 对每一个在第一步中建立的内部的XML订单文档,将其与合作伙伴指定XSL表合并来建立待外送的订单文档。这个文档包括两个主要的部分,标题和数据包。标题包含发送数据包的所有信息。数据包则是跟据合作伙伴指定的规范格式化的XML数据。当第二步完成时,所有的待发送订单文档被储存在合作者输出目录。

字串3


步骤三:分发数据包 对每一个在合作者输出目录中的订单文件,系统读取标签中的发送方法和其对应的参数。它将数据包发给知道如何使用指定的方法分发XML文档的运行进程。当第三步完成,外送的文档被储存在合作者档案目录中。
  这个系统的特性之一是往后加入一个新的合作伙伴到系统中只需做少量的工作。甚至,一个未来的伙伴需要我们发送一个CSV文件到其指定的电子邮件地址时,我们只要写一个XSL文件就可以解决大多数问题。同样容易的是,我们能够分发一个HTML报表,一个Excel电子表格或是一个纯文本的Email消息。

开始工作

  这个处理程序是一个VB可执行文件,叫做PartnerOrderProcess.exe。在每一步,程序使用Filesystem 对象读取并移动XML文件。因此为了给应用程序足够的信息还需要完成这些任务,一个XML文件AppInit.xml 与exe文件在同一个目录中 ,文件中包括所有的不同种类文件的系统位置。这个例子应用程序中的设置如下:


字串2
(说明:虽然在本文包括的例子中这些目录位置是在AppInit.xml文件中直接给出的,但是还有其它几种方法。例如,你可以写一个简单的VB程序为你生成AppInit.xml文件。另一种增强的AppInit.xml还可包括无DSN的连接字符串。)

  这个简单的应用程序覆盖两个例子。为了使之更吸引人和演示一些有趣的例子,第一个案例要求我们的处理程序发送订单文件到合作者指定的URL地址。但是我们打算从表单中以字符串变量的形式发送XML数据,并且通过HTTP协议监听回程信息。合作者将通过HTTP流格式返回XML数据。这例给出的例子代码利用了微软的XMLHttp对象来发送和监听回应。

  第二个案例要求我们简单地复制为合作者准备的XML文件到不同的本地目录。这是很灵巧的,举例来说,你可能需要将文件放置在FTP目录中,或者是你想要从中动态地建立Web报表的目录。



第一步

  处理程序使用SQL服务器数据库中的数据建立一般的内部XML订单文件。对于我们的例子,我们将从三张表中抽取数据,包括PartnerInfo、PartnerOrders和PartnerOrderItems。(一个SQL脚本包括在下载的例子中,因此你可以自己建立此数据库)。PartnerInfo储存了第二步中需要的合作伙伴指定的XSL文件的目录位置。PartnerOrders和PartnerOrderItem包含了所有的从Web站点生成的订单数据。你同样可容易地从现存的订单表中抽取数据,并且把他们和类似于PartnerInfo的表连结起来。

字串9



  在步骤一中,处理程序简单的查找所有还没被处理的合作伙伴订单数据。它获取这些数据并建立我们内部的XML订单文档。这些文档包括一个所有数据超集,这些数据是我们可能需要传送给未来的合作伙伴的。这些文档都是一般化的并且遵循一个内部的标准,这是为了任何我们的系统可以理解如何读取这些文件。第一步完成以后,所有生成好的文档被保存在内部发件箱中。

  内部XML订单文档的特性:

包含了合作伙伴指定的XSL文件的目录位置
遵循内部标准(可能的话最好是工业标准)
是订单数据的超集
  让我们随着这段XML语句贯穿整个系统:


John P Doe
Street Address1
Apt 1

CityName
ST
88888
US 字串8
123?56?890
Standard Shipping


(注:这将是研究为了你们的产业而现存的标准的良好场所。检查大纲(Schema,译注:描述XML文件信息结构的文件,用来替代DTD的功能)或是DTD库(译注:DTD是文档类型声明,全称是Document Type Declaration)。这样你就不必做重复劳动了。)( 译注:在国内还不可能有行业标准Schema)

步骤二

  处理程序依次整理在发件箱中的内部订单,并载入 XML 数据。于是它使用 XML DOM(译注,DOM是文档对象模型,全称是Document Object Model)查询文档,并且查找到合作伙伴指定的XSL文件的位置。处理程序载入正确的XSL文件并且将它合并入内部的XML订单数据来建立待发送的订单XML文档。如果这儿出现任何错误,处理程序保存内部XML订单到内部订单出错目录中。如果没有错误发生,内部的XML订单文档则被保存到存档目录中,并且新的外送文档将存在于合作者的发件箱目录中。

外送订单XML文档的特性:

这个文件包含了处理程序为了分发订单到给定合作伙伴的所需知道的所有信息。它包括两个主要的元素:标签和数据包

字串1


标签包含一个分发的方法(例如:"PostAsForm",或是"FTP")
标签包含任何所需的分发参数(例如:"PostToURL",或是"FTPassword")
数据包是为了加工合作伙伴订单数据的一个容器元素
数据包是合作伙伴指定格式的数据
在此给出的应用程序,订单数据从我们内部XML格式转化为合作者指定的XML格式
  在这一步中我们要解决的最大的问题是怎样将我们的数据转变成合作者指定的格式。在这个例子中合作伙伴A要求运送详细信息如下:




John Doe
Street Address1
Apt 1
CityName
ST
88888
US
ups_ground

伙伴B的要求是:


字串5

字串5

John Doe

Street Address1

Apt 1

CityName,ST 88888

US


  
  这儿,我们看到问题存在于转换运送信息的时候。一个完全的订单是相当复杂的。让我们看一下XSL代码也就是转换我们的运送信息到输出适合合作伙伴A的需要:













字串6













还有转换我们的运送方法到合作者,我们调用这个模板: