|
|
|
[XML初学进阶]XML(46)数据交换 网上资源
|
|
9.1.1 XML数据交换机制
XML可以分为三层结构,数据表现层,数据组织层和数据交换层。在我们对表现层和数据组织层有了一个比较全面比较深入的了解后,最后再来看看XML的最底层——数据交换层。
我们知道,从整体上讲,XML定义的实际上是应用间传递数据的结构,而且这种结构的描述不是基于二进制的、只能由程序去判读的代码,而是一种简单的、能够用通用编辑器读取的文本。利用这种机制,程序员可以制订底层数据交换的规范,然后在此基础上开发整个系统的各个模块,而各模块之间传输的数据将是符合既定规则的数据。另外,XML还允许为特定的应用制定特殊的数据格式,并且非常适合于在服务器与服务器之间传送结构化数据。
从应用的角度来看,XML信息交换大致可分为下面几种类型:数据发布、数据集成和交易自动化。
数据发布
当今时代可以说是信息爆炸的时代,而互联网的出现又起到了推波助澜的作用,人们对信息的获取不再局限于读书看报,“到网上去冲浪”业已成为网迷们的口头语,并逐渐为越来越多的人所接受。在这种新生的环境下,业内人士不失时机地提出了“同一数据,多次出版”的解决方案。这种方式使我们只须制作和管理同一信息资源,就能够达到多种媒介出版和多种方式发布的目的。
先来看一下传统的信息发布方式--基于纸介质和CD-ROM的信息发布。虽然CD-ROM与纸张属于不同的介质,但是由于他们采用的数据格式基本一致,因此将他们归为一类。
早期制订的媒介无关的描述结构化信息的国际标准当属SGML-ISO 8879 1996,但是XML的出现,使得跨媒体数据发布技术又向前发展了一步。2000年5月18日,一个由数字印刷领域的知名厂家组成的所谓“按需印刷”组织(PODi)发布了“个性化印刷置标语言”(Personalized Print Markup Language, PPML)规范。这是一种基于XML的技术规范,主要用于带有可再利用内容文档的快速印刷。可以说,有了XML,跨媒体、多介质的数据发布显得更是顺水推舟。
最值得一提的是基于Web的网上发布。HTML作为Internet上Web网页描述语言已经为大家所熟知,而同HTML一脉相传的XML当然也可以在网上发布,当然需要配合样式信息(如CSS或XSL),因为正如你所知,XML只是定义文档内容而不涉及具体表现。另外,一种更为直接的Web发布语言也已诞生,那就是XHTML。XHTML是一种基于XML的超文本置标语言,也就是说,将以前用SGML定义的HTML改为用XML重新定义。现在,XHTML已经作为W3C的建议标准公布于众,相信在不久的将来会大有作为的。
数据集成
如果说数据发布涉及到的是服务器-浏览器形式的数据交换,那么,数据集成则是一种服务器-服务器之间的数据交换。
现实世界中,一个企业需要涉及各种应用,小到上下班打卡系统,大到人事管理系统、财务核算系统、库存管理系统等等。一般情况下,各个系统可能是由不同的软件公司开发的,软件可能采用不同的技术、运行于不同的平台。但是企业的运作是一个整体,需要各个系统相互配合,于是应用系统间的数据交换接口就成为困扰信息主管的一大难题。于是,可能会出现这样的尴尬局面:月初,上下班打卡系统管理员将上月的员工考勤数据打包传送给人事部门(或用软盘或由网络发送),财务部门也将员工所在部门的销售业绩统计打包传送给人事部门,而后,人事干事运行一个批处理程序合并考勤数据和业绩统计,最后计算出员工工资。类似的情况几乎可以说比比皆是,但这是现实。企业缺乏一个顺畅的业务管理平台,不能将各部门的信息有机的集成在一起,势必造成管理上的混乱。
XML是解决这一问题的强大法宝。让我们再来分析一下这个假想的示例,其实,造成这种混乱局面的原因说到底,就是各个系统没有统一的数据结构约定。其后果不但是效率低下,而且信息冗余、重复开发也会造成资源的巨大浪费。在这种情况下,XML将起到粘合剂的作用,通过它,使得各业务模块有机结合,数据交换畅通无阻,从整体达到理顺业务操作的目的。
同所有软件开发规范一样,实现数据集成也必须分步骤、有条理地进行:
首先,要对整个业务进行调整,摈弃不合理部分。也许你会说:是不是跑题了,这同XML有什么关系?表面上看,似乎风马牛不相及,其实不然,基于XML的数据集成不仅仅是要进行系统开发,对旧有系统的合理改造也是很重要的。
然后,对业务模式归纳总结并从中抽象出数据交换模型,当然是基于XML的数据交换模型,也就是说制定数据交换的DTD或Schema。这是最基本的,但同时也是最为困难的一步。XML消息流要符合企业的信息流。不要将XML看作是用来代替对象或者开发软件的新方法,它应该是一种表达层次结构信息并且在不同的应用系统间传输这种信息的有效途径。在制定XML数据交换模型中,一个易犯的错误是直接照搬原来的数据格式而仅仅将其逐字逐句地"翻译"成XML,毕竟这是一个改造旧系统的"工程",去粗存精方是上策。
最后一步,结合制定好的XML数据交换模型,运用XML DOM和SAX等技术编写应用程序,也可直接在原系统上进行改造。也许这是一件比较棘手的工作,毕竟任何新生事物和新技术的出现都会打破一些人的陈旧观念,但是好在学习XML及其应用开发技术并不是一件非常难的事情。
前面我们讲的是关于企业内部的XML数据集成,其实不同企业间的数据交换也是XML的用武之地。电子商务交易平台之间的XML B2B信息交换就是很好的例证。同企业内部的数据集成不同,企业间的XML数据集成需要由一个开放的、需要交易各方共同遵守的“法规”——基于XML的数据交换标准。目前全球电子商务的发展非常迅速,各种行业甚至跨行业的XML电子商务规范与框架层出不穷,其中比较有代表性的是:Ariba的cXML、IBM的tpaML 、CommerceOne的xCBL 2.0 、Microsoft的BizTalk框架、CommerceNet的eCo计划、RosettaNet的eConcert计划与PIP规范集以及联合国UN/CEFACT小组和OASIS发起的ebXML计划。XML技术的融入,使得企业间的交易不再局限于专网和特定的应用,而是可以在Internet上的不同系统间交换信息,不仅大大降低了成本,而且提高了数据的可持续性,从而保护了既有投资。
交易自动化
XML也有助于提高应用的自动化程度。遵循共同的标准,使得应用程序开发商开发出具有一定自动处理能力的代理程序,从而提高工作效率。一个典型的应用是,开发这样一个智能代理程序:首先,该程序向某电子商务交易系统发出一个供货商资料查询请求,在得到应答后,自动连接答复中提供的所有供货商站点;然后,搜索预定商品的信息,并对获取到的不同商家针对该商品的价格、质量、服务等信息按一定的商业规则进行比较;最后,得出理想的结果,并自动向该站点下订单。下图即示出了这种自动交易的过程:
500)this.width=500'>
9.1.2 XML数据存取机制
作为一种数据存储与交换的模式,长期以来文件系统占据了信息领域的大片江山,至今仍广泛采用。但是我们同时也会看到另一面。当今世界,技术发展迅猛,信息量也随之激增。的确,很难想象,面对成千上万的数据文件,如果仅仅通过文件系统来管理的话,那么无论是文件的搜索还是文件的调用,诸如此类的管理工作都将是不可能的。
现在,不论是什么行业,大多数关键数据都是放置于数据库中进行管理的,一来目前数据库技术已经相当成熟,二来其管理功能非常强大。以往的数据库应用,基本上都是基于C/S模式,数据底层结构一般来说都是相对固定,也就是说,开发出来的应用程序是针对具体的数据结构,其应用范畴受到一定限制,开放性较差。而XML作为一种可扩展性置标语言,其自描述性使其非常适用于不同应用间的数据交换,而且这种交换是不以预先规定一组数据结构定义为前提,因此具备很强的开放性,具有广阔的应用前景。为了使基于XML的业务数据交换成为可能,就必须实现数据库的XML数据存取,并且将XML数据同应用程序集成,进而使之同现有的业务规则相结合。
XML数据源多种多样,根据具体的应用,大概可分为下面三种:一种是XML纯文本文档,第二种是关系型数据库,第三种则来源于其他各种应用数据,如邮件、目录清单、商务报告等。其中,第一种来源,即XML纯文本文档是最基本的也是最为简单的,将数据存储于文件中,其最大的优点在于可以直接方便地读取,或者加以样式信息在浏览器中显示,或者通过DOM接口编程同其他应用相连。第二种数据来源是对第一种来源的扩展,其目的是便于开发各种动态应用,其优点则在于通过数据库系统对数据进行管理,然后再利用服务器端应用(如ASP、JSP、Servlet)等进行动态存取。这种方式最适合于当前最为流行的基于三层结构的应用开发。第三种数据由于来源广泛,因此需要具体情况具体对待。本小节的分析主要针对前两种数据来源进行分析。下图示意了XML的数据存取机制。
500)this.width=500'>
对于XML文档,可以通过DOM(Document Object Model)读取XML文档中的节点,这是最基本也是最底层的XML存取技术。正如上一章所述,DOM是W3C的一种技术标准,实际上是提供一组API来存取XML数据,可以通过JavaScript、Jscript、VBScript等脚本程序来调用,也可通过C++、Java等高级语言来实现。
其次,通过DSO(Data Source Object)进行XML的数据绑定可以方便地将XML节点同HTML标记捆绑,从XML文档中读取或写入数据,就象访问Microsoft Access或Microsoft SQL Server一样。DSO的工作方式有几种,一种是同DOM类似通过对XML节点树进行遍历来搜索节点,每次仅将节点数据同HTML的一个元素(如SPAN元素)相联;第二种同第一种的不同之处在于将节点数据同一个HTML多值元素(如TR元素)相联。
样式单CSS和XSL实际上通过给XML数据赋予一定的样式信息以使得其能够在浏览器中显示。CSS技术早在HTML3.2中就得以实现,其关键是将HTML中的元素同预先定义好的一组样式类相关联以达到样式化的目的,而XML同样也支持这种技术。XSL同CSS有些类似,不同之处在于它是通过定义一组样式模板将XML源节点转换成HTML文档或其他XML文档。XSL实际上也是符合XML规范的,它提供了一套完整的类似控制语言的元素和属性,最终可完成丰富多采的样式描述。
利用ASP在页面文档中嵌入ADO对象从数据库中提取XML数据是Microsoft对其ASP技术的一种扩展,功能非常强大。ADO取得数据后,可以调用DOM提供的API来动态生成XML文档,并进而同其他应用交换数据,或者直接在浏览器中显示。
最后,HTTP+SQL是Microsoft新近提出的XML数据库解决方案的核心,其基本原理是通过基于HTTP协议的URL方式直接访问SQL SERVER数据库,并返回以XML或HTML数据格式的文档。
前一节我们提到的XML信息交换类型,从某种意义上讲,都和数据库息息相关。先来看一下数据发布。如果有适当的浏览器(如Microsoft IE5.0),XML可以直接显示。但是现实情况是,大量的信息不可能都以XML文件的形式存在。在实际应用中,需要从数据库中提取信息,动态生成XML页面,然后加以样式化并发送到客户端浏览器。至于数据集成,同样也离不开数据库。企业间交换的B2B数据往往来自于数据库,比如产品目录、订单信息、用户资料等等。B2B应用在接收到XML数据后也可将其保存至数据库。最后,自动交易系统在得到不同供货商提供的商品价格、质量、服务等信息后,也可将其存入数据库,以便作为决策系统的数据来源。
9.2.1 XML与关系数据库
上一节我们讲到了XML的数据存取机制,从一个较高的层面上分析了数据存取的多种方式。作为其中的一种,数据库数据存取机制似乎倍受青睐,但我们并未对此作比较深入的探讨,这一节里让我们对XML与数据库的关系进行一些详细的分析。
我们知道,数据库提供了对于大批量数据的有效存储管理和快速信息检索、查询的功能。从体系结构上看,数据库技术的发展历经了网络型数据库、层次型数据库、关系数据库、面向对象数据库。虽然面向对象数据库融入了面向对象技术,但是到目前为止,在各个领域使用最广的还是关系数据库。关系数据库管理系统(RDBMS)采用二维表格作为存储数据的模型,如下图所示,表格由行和列组成,一般情况下,列被称作"字段"用于表示组成数据有效信息的属性,而行则用于指示一条完整的数据记录。由于数据间的相关性可以通过表与表之间关键字(外键)来关联,由此产生了"关系"类型数据库的由来。
500)this.width=500'>
关系数据库有自己的查询语言——结构化查询语言(Structured Query Language, SQL)。SQL最初由IBM提出,后经不断发展,已于1986年成为业界标准并被广泛采用。SQL 是非过程性的。当SQL语句传送到数据库服务器后,服务器返回满足条件的结果或结果集(视具体查询项目而定)。一般情况下,大多数支持SQL的服务器系统均采用客户/服务器架构,现在又发展到更为先进的分布式处理架构。这样一来,SQL服务器既可以接收客户应用程序发送的查询请求,也可以接收其他服务器的查询请求,这些服务器可能是其他SQL服务器,也可以是XML服务器。
与XML文件不同,数据库将不再扮演简单的数据容器。数据库可以相当灵活,因为可以存储在数据库中的不仅仅是单调而枯燥的数据,还有适合于应用需要的规则和模式。针对XML数据,一般有两种存储方式:一是将其按结构层次拆分开来分别存于不同字段,二是将XML文档原封不动地存入数据库。实际应用中,后者的应用环境将受到一定限制,因为关系数据库不能很好地处理大容量的结构化的信息和文本数据。当然,也可以将结构化置标文本分解成尽可能小的部分,然后转换成数据库中的字段来存贮,但是这样在数据库的检索、索引方面会增加许多额外的工作。至于前一种方式,因为关系型数据库并不能很好地支持层次、顺序、包含等在结构化置标语言中十分本质的关系,所以在开发中也仍有很多问题要解决。
9.2.2 XML与面向对象数据库
面向对象数据库源于计算机编程语言中的面向对象技术。同以往的结构化编程语言相比,面向对象技术提供了一种同现实世界更加贴切的表达方式,它利用封装技术将属性和方法集成于对象之中,并且借助继承和派生的概念将对象及其子对象紧紧联系在一起。面向对象技术体现了人类对生存于其中的世界的认知过程,而同数据库技术的结合,则又是一种在计算机应用领域的进步。面向对象数据库管理系统(OODBMS)使得文本、图像、视频和空间数据可以存储在数据库中,不过与关系数据库不同:在关系数据库中,数据仅仅是数据,它不包含层次结构信息;而面向对象数据库可以将数据视为对象,数据是作为一个整体,包含了属性和方法,并能体现数据间的继承关系。下图示出了面向对象数据库管理系统概念。
500)this.width=500'>
从理论上看,相比关系数据库而言,面向对象数据库具有技术新、效率高的优点。为此,曾经有人大胆预言,面向对象数据库体系结构将迅速取代传统的关系数据库体系结构。但是,事实证明,这一预言是错误的,真正的面向对象数据库系统还有很长的路要走。这其中的原因是多方面的,比如面向对象技术较为复杂、面向对象数据库技术的工业化成熟程度不够高等等。作为一种折衷,利用现有的优势、改造关系数据库并融入面向对象技术,即所谓的对象-关系数据库,则不失为上策。如今,IBM、Oracle、Informix等知名厂商已经宣称其数据库产品支持面向对象技术。
但是,XML的出现给面向对象数据库注入了新的生机和动力。前面我们提到,当XML同关系数据库相结合时,一般需要将XML文档按元素层次结构拆分后依次存入数据库中的相应字段。显然,这样一来,XML文档的整体性将受到破坏,除非有一个预先设定的小程序对数据库中数据进行整合,否则XML数据将变成一团糟。(当然,如果将数据库字段作为元素的属性看待,也许这种做法倒是可行的。可聪明的读者一眼就能看出,这种假设的前提是,该XML文档将只能表达简单的结构,再复杂一点就不行了。实际上,这种情况简直是难以想象的,因为现实世界是纷繁复杂的。)而面向对象数据库就不同了,因为此时,XML将不再被拆分而是被描述成一个对象存入数据库,其优点显而易见,XML数据的结构和语义信息可以完整地保留下来。XML及其在各个领域的应用前景使得面向对象数据库重新受到广泛重视,一些针对XML的面向对象数据库纷纷推出,例如:Xhive和XML Repository就是很好的例子。著名的Object Design公司也调整策略,将其面向对象数据库产品ObjectStore融入XML Server体系之中。值得一提的是,他们还将公司更名为eXcelon,以便更好地体现该公司的战略部署。
9.2.3 基于XML数据库的模型分析
前面讨论了关系数据库、面向对象数据库以及它们所提供的对XML的支持,那么,究竟什么样的数据库才能称得上是XML数据库呢?我们认为,一个基于XML的数据库系统应该具备以下特征:
能够根据文档类型定义(DTD或Schema)确定数据库的模式。也就是说,能够按照DTD或Schema来定义数据库,而无须再进行数据库的设计,能够按照DTD或Schema的层次结构来进行基于XML语法的定位和查询。通过元素名字和属性来查询和定位元素。
支持DOM和SAX,可以进行事件驱动的XML处理。
内置数据处理语言模块(XML语法分析器),能够进行XML文档数据的语法分析,同时对数据库中的元素进行直接的定位操作。
提供标准的XML查询语言。通过套用一定的样式模式,输出多种格式的XML文档。
能够处理大型数据集合,能够对置标文本的结构和内容进行索引。
提供开发工具包,支持DOM、SAX、Java、Script语言等。
提供一定的机制保证数据的一致性。如通过行级或页级共享锁、排他锁对数据加锁,满足用户对数据进行并发读写时数据的有效性。
支持OLAP和数据仓库等高级应用。
根据上面提到的特征,一个标准的XML数据库管理系统应由下列几个模块组成:
数据编辑模块--XML编辑器
能够以图形化、交互式界面方式对XML文件实例进行编辑,方便用户对XML文件的编辑、修改等操作。另外,该编辑器还应提供同后端数据库的接口,使得用户能够方便地从数据库中调出已有的资料进行利用。编辑器应该有良好的用户交互界面,多文档编辑,能够支持通用的文件类型,支持CSS和XSL,能够按照样式文件进行结构化文档的显示,查看源文件、DTD、Schema,能够进行结构导航。EditML技术公司开发的一种开放软件EditML就是很好的例子。
语法分析模块--XML Parser
能够对XML文本进行语法分析,能够进行元素的定位和查询。语法分析模块负责对DTD文件、XML文件的语法分析,能对错误进行定位并提出建设性的改进意见;语法分析模块还负责生成XML文件的结构树,并能从结构树到文件实例的映射;负责按照文件类型定义生成数据库的模式,包括数据库字段的定义、可能的数据类型、存储量的估计等等。
数据库的管理模块--DB Manager
提供图形化的数据库管理功能,包括对XML文本资料的存贮、索引、检索等功能,提供数据的备份、复制等功能;能够对不同的文件类型定义的置标文本进行分类存贮。其他的管理功能包括多用户并发共享数据库的加锁机制等等。
索引和检索模块
一个基于数据库的搜索引擎,它应该能够理解结构化置标树结构,提供全文索引和区域索引,对元素和属性进行索引,对结构和内容进行索引,能够按照元素和属性定位并检索元素。
数据库接口模块
提供数据库系统的应用程序接口模块(API),包括数据库本身的编程接口以及XML数据库的标准查询接口。这是对一个开放型系统的最低要求。
9.2.4 XML在数据库中的应用模式
通常,XML在数据库中的应用模型需要借助三层架构来实现。在这种模式下,一般会有一个代理程序运行于中间层,通过它来访问数据库管理系统中的数据和输出XML文档。想必大家都对建筑工地上运载材料的吊车不太陌生吧?通过吊车,工人们就可以将地面的建筑材料运上高高的建筑操作平台;同时,也可以将平台上的废料送至地面,大大提高了劳动效率。代理程序也起着同样的作用,实际上,它是一种在客户端桌面应用层与底层数据层之间传递数据的工具。利用CSS或XSL技术,XML可以实现基于Web浏览器的多样式可视化显示。另外,这种代理程序还可以进行双向的基于事件的数据更新,也就是说,客户端的数据变化(如数据的插入、删除、修改等)可以通过代理程序反映到底层数据库,而数据库的更新也能够通知到客户端。表面上看,这种机制同传统的三层架构没有什么区别,但实际上是不同的,因为此时在传输过程中的数据都是已经XML化了的。
微软在其Windows分布式Internet应用(即Windows DNA)架构中集成了XML技术。通过中间层的代理程序,可获取的数据来源可以不必局限于某台固定的数据库服务器,而可以是分布于企业内,甚至于遍及全球各地的数据库服务器。另外,借助于XML Schema,开发者就能更为精确地描述和交换数据,因而大大地提高这种应用的效率。
XML提供了一种连接关系数据库和面向对象数据库以及其他数据库管理系统之间的纽带,如下图所示。XML文档本身是一种由若干节点组成的结构,这种特点使得数据更适宜于用面向对象格式来存储,同时也有利于面向对象语言(C++、Java等)调用XML编程接口访问XML节点。关系数据库和面向对象数据库首先需要将数据从数据库中提取出来,经过转换为或直接以XML数据形式发布到网上(局域网或Internet网),然后相互交换数据,经应用层系统处理后再转存入库。
500)this.width=500'>
开发一个访问数据库的XML应用系统需要同时借助XML编程接口和数据库编程接口,前者用于对XML文档的解析、定位和查询,所需技术包括DOM和SAX;后者则是用于访问数据库,如数据库中数据的更新和检索等等,需要利用的技术有ODBC、JDBC、ADO等。
另外,XML文档的模式(如DTD和Schema)以及数据库的模式对于开发此类应用也是必不可少的。由于它们均可自定义数据类型,因此可以通过信息的封装来简化程序的设计。对于数据库来讲,它可以利用CREATE TYPE命令来定义对象类型。下面的示例展示了如何在数据库中定义对象类型,本例以Oracle 8i为数据库平台。
CREATE TYPE CLIENTLIST AS OBJECT( Name VARCHAR2(10), ID int, Company VARCHAR2(20), Email VARCHAR2(20))
下面再给出XML Schema的相应描述。
<?xml version="1.0" encoding="GB2312" ?>
<Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name= "姓名"/> <ElementType name= "ID"/> <ElementType name= "公司"/> <ElementType name= "EMAIL"/> <ElementType name= "联系人" content="eltOnly"> <element type= "姓名" /> <element type= "ID" /> <element type= "公司" /> <element type= "EMAIL" /> </ElementType> <ElementType name= "联系人列表" content="eltOnly" order="many"> <element type= "联系人" /> </ElementType></Schema>
由以上例子可以看出,“联系人”对象中包含了“姓名”、“ID”、“公司”、“EMAIL”四个元素。
9.3.1 ADO控件技术
到目前为止,已有大量关于XML的数据交换技术和应用面世。其中,有的只是在现有技术的基础上扩展XML支持,有的属于XML中间件产品,还有的是比较完整的XML应用。它们大多数都提供了对数据库的支持,这恰恰从一个侧面反映出XML与数据库的密切关系以及基于XML数据库应用的潜力。不同的编程语言和脚本语言需要不同的SQL API和XML语法分析器组合。例如,对于一个C++程序员来说,编写一套访问数据库的XML应用程序可能需要利用ODBC和C++ XML语法分析器;而对于一个Java程序员来说,可能只需要JDBC和Java XML语法分析器就够了;更为特殊地,如果你对微软的Visual Basic和VBScript脚本语言比较熟,那么很有可能你会用它们来开发XML应用,此时,你只要再学习一下ADO,然后借助微软的XML语法分析器进行编程(注:微软在其浏览器产品IE5.0中内置此语法分析器msxml.dll)。
下面我们就多花一些笔墨来对各种XML数据交换技术及其应用进行一些分析,其中还会有重点地给出一些典型示例。首先要讲解的是大名鼎鼎的ADO控件技术。
说到ADO就不得不先提一下ASP。ASP(Active Server Pages)是一种在服务器端解释执行的脚本技术,主要用于基于Web应用,如动态网页的Web浏览等等。它是由微软公司开发的,最早出现于IIS 3.0。ASP通过在HTML页面中嵌入脚本语句,并结合ActiveX控件技术(如ADO、CDONT等),从而建立页面丰富、动态、交互而且高效的WEB服务器应用程序。ASP支持的脚本语言有两种,即VBScript和Jscript,缺省为VBScript。ASP的工作原理是:当客户端浏览器访问Web服务器ASP文件时,服务器根据被访问文件的扩展名(.asp)识别出其类型从而启动该ASP解析器,首先服务器会遍历文件的全文,当遇到嵌入的服务器端脚本语句时就执行相应脚本(可以是启动计数或者查询数据库等等)并将返回结果按指定方式送回原处,脚本处理完毕后将生成的HTML页面文档返回至客户端,整个过程结束。
虽然ASP并不是专门为XML量身定做的,但由于XML的可扩展性以及ASP自身的结构特性,使其又可以同XML相结合,从而实现利用ASP技术进行XML数据交换。下面我们将用一个具体示例,演示如何利用ASP进行XML数据交换。在本例中,运用了ADO控件来访问关系数据库并输出XML文档,另外还采用了DOM和XSL技术,实现了XML对象的访问和XML文档输出的样式化。
我们仍用反复提及的一个例子——“客户联系信息”。这次我们是把数据放置于关系数据库中,然后运用ASP和ADO技术动态生成XML实例文档。假设我们事先已在Microsoft SQL Server数据库CLINETS中创建了一个数据表--clientList,其数据结构如下表所示:
字段名
释意
类型
是否为空
Name
姓名
varchar(10)
NOT NULL
ID
ID
int
NOT NULL
Company
公司
varchar(20)
NOT NULL
Email
EMAIL
varchar(20)
NOT NULL
假设现在数据库中已经存了如下记录:
Name
ID
Company
Email
张三
1
A公司
zhang@aaa.com
李四
2
B公司
li@bbb.org
下面开始我们的编程之旅。首先是要创建一个数据源,数据源(ODBC Source)实际上是定义数据来源,也就是说用来告诉程序数据的出处。有一点需要注意,数据源的创建要在服务器端进行,因为ASP本身就是在服务器端运行的。其实要做的很简单:打开控制面板,鼠标双击"ODBC数据源",添加数据源,选择"SQL Server",分别配置服务器名(CLIENTS所在服务器)、数据库名(CLIENTS)、数据源名称(此处定为clientList)、用户名(sa)、用户口令(空),数据源就配置好了。下面来编写相应的代码,代码将通过调用XML DOM动态生成XML结构,然后借助ADO访问数据库动态填充XML内容。
<% @language = "VBScript" %><% Response.ContentType = "text/xml" %>
<?xml version="1.0" encoding="GB2312" ?><%’动态构建XML文档 set xmlDoc = Server.CreateObject(Microsoft.XMLDOM) set root = xmlDoc.createNode("element","联系人列表","") xmlDoc.appendChild(root)
’查询数据库 sqlStr = "select * from clientList" set cConn = Server.CreateObject("ADODB.Connection") cConn.Open "CLIENTS","sa", "" set rsData = cConn.Execute(sqlStr) rsData.MoveFirst()
while (not rsData.EOF ) ’构建联系人子节点 set tmpNode = xmlDoc.createNode("element","联系人","") xmlDoc.documentElement.appendChild(tmpNode) ’构建姓名、ID、公司、Email子节点 for I = 0 to rsData.Fields.Count - 1 set childNode = xmlDoc.createNode("element",rsData.Fields(i).Name,"") childNode.text = rsData.Fields(i) tmpNode.appendChild(childNode) next rsData.MoveNext() wend
Response.Write(xmlDoc.xml)%>
运行该ASP,将生成下面的XML文档。
<?xml version = "1.0" encoding="GB2312" standalone = "no"?><联系人列表> <联系人> <姓名>张三</姓名> <ID>1</ID> <公司>A公司</公司> <EMAIL>zhang@aaa.com</EMAIL> </联系人> <联系人> <姓名>李四</姓名> <ID>2</ID> <公司>B公司</公司> <EMAIL>li@bbb.org</EMAIL> </联系人></联系人列表>
通过调用XML DOM动态生成XML文档似乎有些繁琐,下面再看一段代码,这段代码是根据前面所描述的DTD(Schema)规则来生成最终的XML实例文档,也即,最终文档的结构是由程序代码来控制的。
<% Response.ContentType="text/xml" %><?xml version="1.0" encoding="GB2312" ?><联系人列表><% Set cConn = Server.CreateObject("ADODB.Connection") cConn.Open "CLIENTS","sa", "" Set rsData = cConn.Execute("select * from clientList") do while not rsData.Eof%><联系人> <姓名><%=rsData("Name")%></姓名> <ID><%=rsData("ID")%></ID> <公司><%=rsData("Company")%></公司> <Email><%=rsData("Email")%></Email></联系人><% rsData.MoveNext Loop rsData.Close Set rsData = nothing%></联系人列表>
运行该ASP,将直接在浏览器显示XML文档,内容同前面得到的结果相同。在上面的示例中,我们看到的是如何通过自定义文档结构生成XML实例文档。显然,这种方案存在一个前提,那就是,开发者必须了解文档结构,并且通过编程严格控制输出文档的格式。但细心的读者可能会产生疑问:既然数据已经存储在数据库中,又何必大费周折重新定义一遍文档结构呢?XML的自描述性何在?为了解决这个问题,微软将其ADO技术进行了扩展以提供对XML的更大支持,结果是可以根据数据库表的内在结构直接输出XML文档,文档的格式将符合默认的DTD定义。下面是一个用Visual Basic 6.0编写的实例:
’声明连接和结果集Dim cConn As ADODB.ConnectionDim rsData As ADODB.Recordset
Private Sub Form_Load() ’连接数据库 Dim query As String Set cConn = New ADODB.Connection cConn.ConnectionString = "DSN=nwind;UID=sa;PWD=;" cConn.Open
’执行数据库查询 query = "Select * FROM clientList" Set rsData = cConn.Execute(query)
’将数据库返回结果集保存至文件 On Error Resume Next Kill ("recordset.xml") rsData.Save "output.xml", adPersistXMLEnd Sub
下面给出的是该程序执行后生成的XML文档--output.xml。通过分析,可以发现,它实际上是一个内嵌XML Schema的XML实例文档。该实例文档的主元素是<rs:data>,命名空间rs由xmlns:rs=’urn:schemas-microsoft-com:rowset’定义;数据库查询返回的每一条记录都作为<rs:data>的一个子元素,用<z:row>表示。<z:row>子元素实际上是空元素,信息均以属性的方式体现,属性来自于返回的数据库字段。内嵌的Schema部分<s:Schema id=’RowsetSchema’>定义了元素<row>的组织结构和规则。
<xml xmlns:s=’uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882’ xmlns:dt=’uuid:C2F41010-65B3-11d1-A29F-00AA00C14882’ xmlns:rs=’urn:schemas-microsoft-com:rowset’ xmlns:z=’#RowsetSchema’>
<s:Schema id=’RowsetSchema’> <s:ElementType name=’row’ content=’eltOnly’> <s:attribute type=’Name’/> <s:attribute type=’ID’/> <s:attribute type=’Company’/> <s:attribute type=’Email’/> <s:extends type=’rs:rowbase’/> </s:ElementType>
<s:AttributeType name=’Name’ rs:number=’1’ rs:nullable=’true’ rs:write=’true’> <s:datatype dt:type=’string’ dt:maxLength=’10’/> </s:AttributeType>
<s:AttributeType name=’ID’ rs:number=’2’ rs:nullable=’true’ rs:write=’true’> <s:datatype dt:type=’int’/> </s:AttributeType>
<s:AttributeType name=’Company’ rs:number=’3’ rs:nullable=’true’ rs:write=’true’> <s:datatype dt:type=’string’ dt:maxLength=’20’/> </s:AttributeType>
<s:AttributeType name=’Email’ rs:number=’4’ rs:nullable=’true’ rs:write=’true’> <s:datatype dt:type=’string’ dt:maxLength=’20’/> </s:AttributeType></s:Schema>
<rs:data> <z:row Name=’张三’ ID=’1’ Company=’A公司’ Email=’zhang@aaa.com’/> <z:row Name=’李四’ ID=’2’ Company=’B公司’ Email=’li@bbb.org’/></rs:data></xml>
ADO提供了文档保存功能,通过它,ASP可以将数据库返回结果集保存至XML文件,这些XML文件经由XSL样式化后可以在浏览器直接显示,也可以传输至其他应用系统供再次利用。另外,值得一提的是,微软在其ADO2.5和IIS5.0中又增加了更高级的支持,即,可以将数据库返回的结果直接转换为XML在浏览器中显示,而不必先保存至文件。下面的实例片段有力地说明了这一点:
<% Set rsData = Server.CreateObject("ADODB.Recordset") Response.ContentType="text/xml"
rsData.Open "select * from clientList", "File Name=" & Server.MapPath("ado.udl") rsData.Save Response, adPersistXML rsData.Close Set cConn = nothing%>
9.3.2 HTTPXML对象技术
尽管XML在多数情况下可以很好地描述数据,但是开发者有时却不得不使用CGI来进行浏览器和服务器之间的数据交换。这是,问题就出现了。从信息交换的角度来讲,虽然CGI是完全能够满足要求的,但是,当CGI同XML一起使用时就会掩盖XML自身的一些优点,从而使得XML在信息交换方面的优势无处找寻。
不过,微软对此已有自己的解决方案,它提供了一种更加有效的方法来传输XML——XMLHTTP。XMLHTTP是微软的又一项基于XML的数据交换技术,主要用于在服务器与客户端交换XML数据。该技术源于微软在其XML DOM实现中引入的一个重要对象——XMLHttpRequest(Microsoft.XMLHTTP),它可以为客户端提供同HTTP服务器通讯的协议支持。简而言之,它允许你打开一个到服务器上的HTTP连接,然后发送和接受数据,并且利用Microsoft XML DOM对返回数据进行解析。
使用XMLHTTP对象通常是进行XML数据交换,但也并不局限于此,其他格式的数据也是允许的。另外,通过同XSL相结合,XMLHTTP提供了一种便捷方式发送结构化查询字串到服务器,然后将返回结果在客户端以多种方式显示。这种交换类型的标准模式是客户端发送一个XML格式的文本字符串到服务器,然后服务器将这个字符串装载入一个XML DOM对象中并进行解析,然后返回一段 HTML给客户端,或者是另外一段XML代码给客户端让客户端的浏览器自己解释。在这种方式下,对于信息的传递是非常有效的,尤其是当使用DHTML进行页面的动态显示时。
下面的一个例子描述了XMLHTTP的上述功能。假定我们在服务器端已有一个XML实例文档client.xml。
<?xml version = "1.0" encoding="GB2312" standalone = "no"?><联系人列表> <联系人> <姓名>张三</姓名> <ID>1</ID> <公司>A公司</公司> <EMAIL>zhang@aaa.com</EMAIL> </联系人> <联系人> <姓名>李四</姓名> <ID>2</ID> <公司>B公司</公司> <EMAIL>li@bbb.org</EMAIL> </联系人></联系人列表>
下面的代码片段描述的是客户端发出请求界面,首先需要输入待查联系人的姓名和公司,点击"查询"按钮后,程序执行查询函数。该函数首先创建一个XMLHTTP对象——xmlHTTP,和一个XML DOM对象——client,前者用于向服务器(http://localhost/Query.asp)发送XML数据(xmlHTTP.send(template.XMLDocument))和接收XML数据(xmlHTTP.responseXML.xml)。
<script language="JavaScript">function QueryClient(){ var xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP"); var client = template.XMLDocument.documentElement;
xmlHTTP.Open("POST", "http://localhost/Query.asp", false);
client.childNodes.item(0).text = cliName.value; client.childNodes.item(1).text = cliCompany.value;
xmlHTTP.send(template.XMLDocument); alert(xmlHTTP.responseXML.xml);}</script>请输入待查联系人姓名:<input type="text" name="cliName">请输入待查联系人公司:<input type="text" name="cliCompany"><input type="Button" value="查询" onclick="QueryClient()">
下面的代码片段(Query.asp)描述的则是服务器端的处理流程,首先创建两个XML DOM对象,一个对应于XML文件client.xml(xmlClient.load(Server.MapPath("client.xml"))),另一个对应于是客户端传送的XML数据(queryClient.load(Request))。然后程序根据传送的XML数据构建XSL查询参数并进行节点定位,如果匹配成功,返回客户端查询到的XML数据;否则返回"<result>查无此人!</result>"的XML数据。
Response.contentType = "text/xml"
set queryClient = Server.CreateObject("Microsoft.XMLDOM")set xmlClient = Server.CreateObject("Microsoft.XMLDOM")
queryClient.async = falsequeryClient.load(Request)xmlClient.async = falsexmlClient.load(Server.MapPath("client.xml"))
set xmlRoot = xmlClient.documentElementset queryRoot = queryClient.documentElement
queryStr = "./联系人[姓名= " & queryRoot.childNodes.item(0).text & " and 公司= " & queryRoot.childNode.item(1).text & " ]"set resultClient = xmlRoot.selectSingleNode(queryStr)
if isNull(resultClient) = false then Response.write(resultClient.xml) else Response.write("<result>查无此人!</result>")end if
9.3.3 DB2XML转换工具
DB2XML是一种将数据从关系数据库转换成XML文档的工具,它提供了一组Java类,是由100%纯Java编写的。DB2XML可以完成下面三种功能:
将数据库查询结果或整个数据库转换成XML文档或者HTML文档(利用XSLT);
提供数据的属性描述;
支持同XSLT样式单处理器的方便集成。
DB2XML可以作为一种工具通过图形界面或以命令行方式单独使用;也可以作为servlet来使用,在这种方式下,它可以动态输出XML文档;另外,DB2XML还可以以API的方式调用,这对程序员来说尤其具有吸引力。从根本上看,DB2XML是一种样式驱动的应用,其输出的XML文档实际上是一组表格,而具体内容取决于用户输入的SELECT命令语句。另外,还可以为该XML文档指定标记名称以及是否包含数据库元数据。DB2XML生成的XML文档是通过两种结构方式来表达的,一种是标准的W3C DOM对象,另一种是利用DB2XML特定的数据结构。但是,不论采用哪种方式,都能够通过数据流或单字节数组进行访问。
DB2XML是通过JDBC对数据库进行存取访问的,其应用开发需要JDK 1.1x以及提供JDBC驱动支持的数据库(如Oracle、Microsoft Access、Microsoft SQL Server、InstantDB、MySQL)。
在DB2XML的开发中,一个重要的类是JDBCXML。下面给出一个典型示例,是一个关于PermissionFrame的GUI应用:
try { jx = new JDBCXML(map); jx.generateXML(); XMLOutput out = new XMLOutput(DB2XML.this, map, jx.getXMLDocument()); if (map.getBooleanProperty("applyStylesheet")) jx.getXSLParser(out).applyStylesheet(); else out.writeToOutput();jx.closeDatabase();} catch(DB2XMLException ex) { DB2XML.this.handleDB2XMLException(ex);} finally { jx.getXMLDocument().deleteTmpFiles();} ...
相关网址:http://www.informatik.fh-wiesbaden.de/~turau/DB2XML/index.html
9.3.4 ODBC2XML转换工具
ODBC2XML是由Intelligent Systems Research开发的共享软件,它实际上是一个Windows动态库DLL,通过它,可以将数据从数据库中提取出来并转换成XML文档。该软件属于模板驱动,也就是说,将SELECT语句作为处理指令嵌入到模板中。ODBC2XML在使用时相当灵活,内嵌查询的返回结果可以直接作为元素或属性存在,甚至可以再次作为其他查询的参数,从而产生嵌套的XML文档。
相关网址:http://members.xoom.com/gvaughan/odbc2xml.htm
9.3.5 XOSL转换工具
XOSL(XML OLE DB Stylesheet Language)是由Mey & Westphal RIPOSTE Software 开发的。同ODBC2XML类似,它实际上也是一个Windows动态库DLL,用于将数据从数据库中提取出来并转换成XML文档,只是它运用了ADO技术。该软件属于模板驱动,它利用特定的XOSL元素将查询语句嵌入到模板中。
同XSL一样,XOSL也可以将用户编写的XML代码从一种表现形式转换成其他形式。所不同之处在于,XSL是将XML转换成XML或HTML,而XOSL则是将任何表格式数据转换成XML。下面给出XOSL的编程示例。
仍以我们所熟悉的一段XML文档为例:
<?xml version = "1.0" encoding="GB2312" standalone = "no"?><联系人列表> <联系人> <姓名>张三</姓名> <ID>1</ID> <公司>A公司</公司> <EMAIL>zhang@aaa.com</EMAIL> </联系人> <联系人> <姓名>李四</姓名> <ID>2</ID> <公司>B公司</公司> <EMAIL>li@bbb.org</EMAIL> </联系人></联系人列表>
在前面讲述基于ADO技术的XML数据交换时,给出的ASP代码如下,该代码直接输出上述XML文档:
<% Response.ContentType="text/xml" %><?xml version="1.0" encoding="GB2312" ?><联系人列表><% Set cConn = Server.CreateObject("ADODB.Connection") cConn.Open "CLIENTS","sa", "" Set rsData = cConn.Execute("select * from clientList") do while not rsData.Eof%><联系人> <姓名><%=rsData("Name")%></姓名> <ID><%=rsData("ID")%></ID> <公司><%=rsData("Company")%></公司> <Email><%=rsData("Email")%></Email></联系人><% rsData.MoveNext Loop rsData.Close Set rsData = nothing%></联系人列表>
下面的代码用XOSL编写,同样可以直接输出上述XML文档。
<xosl> <联系人列表> <command source="select * from clientList" connectionstring="CLIENTS"> <联系人> <姓名>!Name</姓名> <ID>!ID</ID> <公司>!Company</公司> <Email>!Email</Email> </联系人> </command> </联系人列表></xosl>
将该XOSL代码同前面的XML文档相比较,可以发现,二者极为相像,区别只是前者嵌入了一些指令和SQL命令,使得后面的代码相比更加直观一些。可以想象,XOSL的出现对于开发XML的数据库应用非常有效。相关网址:http://www.riposte.com/xosl/
9.3.6 ASP2XML组件
ASP2XML是由Stonebroom开发的。它实际上是一个用来在XML文档和任意ODBC或者OLE-DB数据源之间双向传输数据的OLE COM组件。该产品是模型驱动的,并且将XML文档模型化成一个单一的表对象。当将数据从数据库传输成XML时,用户制定一个单一的SELECT声明,输出包含ASP2XML自定义的标志。当将数据从XML传输给数据库时,XML文档中必须包含ASP2XML自定义的标志,它们是该中间件处理时要用到的。这个组件可以在ASP脚本中使用,也可以当一个普通的组件使用。相关网址: http://www.stonebroom.com/asp2xml.htm
9.3.7 InterAccess软件包
InterAccess是由XML Software Corporation开发的一套软件包。该软件包是一种以客户/服务器方式通过互联网访问ODBC/OLE DB数据库的软件,客户端和服务器之间以XML数据格式双向交换数据,其独特之处在于采用TCP/IP而不是通常的HTTP作为数据传输协议。InterAccess是由三个模块组成的:InterAccess服务器软件、InterAccess客户端COM动态库、InterAccess浏览器。参见下面的InterAccess体系结构图。
500)this.width=500'>
InterAccess 服务器软件运行于服务器上,专门用于处理客户端请求:从数据库中检索数据生成XML格式数据传送到客户端;或者接受客户端发送的XML格式数据并存储于数据库中。由于XML文档中的数据是以对象树的形式存在,因此很方便地即可将数据保存至数据库表中或从数据库表中检索。
在客户端,由一个COM对象处理与服务器的通讯。开发者可以利用内置的API接口函数开发应用程序以检索非XML格式的数据,也可以利用回调函数处理服务器方返回的XML数据。
InterAccess 还提供了一个专用浏览器,通过它,用户可以察看数据库表的内容或者执行SQL语句,最终结果可以保存或者拷贝/粘贴至其他应用程序,如Microsoft Excel 或Access。
下面给出的例子展示了如何通过调用InterAccess提供的COM组件开发基于XML的数据库应用。该例子通过一个数据源连接、登陆远程主机,向数据库发出SQL查询命令,最后打印返回的数据集。从形式上看,同ADO极为相似。
Private Sub btnCommand_Click() ’定义出错处理 On Error GoTo Error
’定义变量 Dim cnn As New XMLDB.Connection Dim strSQL As String Dim ds As XMLDB.IDataset Dim col As XMLDB.IColumn
’连接并登陆数据库 cnn.Connect "iaccess.xmlsoft.com.au", 7777 cnn.Login "TRIAL", "", ""
’执行SQL查询命令 strSQL = "SELECT * FROM clientList WHERE ID like ’B%’" cnn.Execute strSQL, E_CMD_TEXT, 0, 30 If cnn.Reply.Result <> 0 Then DisplayErrors cnn.Reply Exit Sub End If
’处理数据库返回结果 Set ds = cnn.Reply.Dataset While ds.EOD <> True For Each col In ds.Columns Debug.Print col.Value Next ds.MoveNext WendExit Sub
Error: MsgBox Err.DescriptionEnd Sub
’显示错误信息Private Sub DisplayErrors(Reply As XMLDB.IReply) Dim Error As XMLDB.IError For Each Error In Reply.Errors Debug.Print Error.Description NextEnd Sub
相关网址:http://www.xmlsoft.com.au/iaccess.html
9.3.8 XML Servlet软件包
XML Servlet是由Cerium Component Software Incorporated 开发的一组商业软件,它可以通过JDBC访问关系数据库在应用系统和数据库之间进行基于XML的双向数据交换。下图展示了XML Servlet的体系结构。
500)this.width=500'>
XML Servlet 实际上是一种Java Servlet,它使用XML指令将XML模板、HTML模板同数据库相结合,利用XML Servlet显示和更新数据库中的数据。XML Servlet的开发模式沿袭了三层架构模式,通过将XML Servlet放置于中间层的Web服务器,使得XML的应用开发相对独立于前端的用户界面(浏览器)和后端的数据库设计,进一步提高了开发效率。
XML Servlet 不是孤立的软件,与之相配套的还有两个工具软件:XMLOutline和XMLDB。XMLOutline采用层次化大纲形式的文本编辑器,利用它可以创建DTD和XML文档。XMLDB可以动态地将DTD和XML文档相结合,进而产生用于将XML文档数据存储与数据库中所需的SQL语句,包括可能的主键和外键。相关网址:http://ceriumworks.com/
9.3.9 WDDX Web分布式数据交换
WDDX,英文全称为Web Distributed Data Exchange,译为中文则是Web分布式数据交换。WDDX是一种基于XML的技术,有了它即使是再复杂的数据也都可以在Web应用程序间相互交换,进而构建所谓的"Web网络联盟"。所谓“Web网络联盟”是基于这样一种概念,也就是说,它描述了一种业务运作方式和操作环境。在这种环境下,一个Web站点团体的内容和商业资产可以被作为一种服务和数据提供给其他Web 站点,并允许这些站点同其他站点结盟。从这种意义上讲,Web网络联盟则是集成了内容和事务以产生更高整体价值的Web站点网络。现在已经有一些典型的Web网络联盟,比如象 Amazon.com的加盟计划,Web诚意计划,以及后台支付处理(如Cybercash)。 WDDX对Web网络联盟的支持是通过在Web系统之间提供一种简单而又透明的粘合剂以传输数据来完成的。利用WDDX,一个采用Perl构建的动态Web站点可以非常方便地同基于其他平台的Web 系统交换数据库数据甚至数据库事务和过程,而不论这种异构系统采用的是ASP还是ColdFusion;反之亦然。
Allaire 发布WDDX的目的是用来解决在Web应用间传输关键数据。需要特别指出的是,最初,Simeon Simeonov-Allaire的语言技术设计师创造了WDDX,用以解决在ColdFusion中遇到的分布计算问题。后来,这项工作进一步发展,演变成为一种跨语言的框架结构,并且最终导致了WDDX SDK和WDDX.org的诞生。WDDX SDK是由一位独立Web开发者-Nate Weiss开发成功的,当然其成功是同Allaire以及其他一些第三方的大力支持分不开的。
讲到这里,也许你要问:WDDX是一种标准吗?它是否被W3C或者其他标准组织采纳?需要指出,WDDX并不是一种正式的标准,并且尚未提交给W3C或其他标准组织。但这并不是说,WDDX没有利用价值。相反,它具有相当光明的前景。第一,它是一种免费软件,可以被自由地使用和发布;第二,它是根据开放、基于标准的技术,如XML 1.0,来制定的;第三,WDDX是技术与智慧的结晶,对于分布式Web应用具有巨大的推动作用。那么,WDDX究竟有哪些具体的优点呢?
WDDX可以给Web开发者带来好处。它解决了在不同Web应用环境(如JavaScript、 ColdFusion、 Perl、 ASP/COM和Java)之间交换数据中的关键问题,不同的应用可以通过WDDX方便地进行跨语言、跨系统、跨平台的复杂数据共享。开发者能够更加方便地构建系统用于在浏览器和服务器或者不同的应用服务器间交换数据,集中精力处理应用规则和算法,而不必关心不同应用的语言环境。
WDDX可以使利用Web进行通讯和电子商务的公司受益。WDDX给他们带来的首要好处在于能够产生新的商业和客户关系。比如说,Web零售商可以方便地将他们的产品通过其他站点发布到客户手中,然后再将他们产品的销售和市场运作转至那些更加易于直接同客户打交道的Web转售商网络。举例来说,某个大型厨具零售商希望利用WDDX将产品发布到其他站点,另外一个站点可以通过他们的站点来提供原始零售商的产品--厨具。不过,实际的商业交易还是在原始零售商的Web站点来管理和运作的。对于客户来说,他们将从特定的商品供应和惬意的购物经历中获取满意的商品;对于中间站点来讲,他们可以通过提供自己并未直接供应的产品和服务来受益;而零售商则可以通过利用网络联盟发布产品来接触更多的客户。同样,类似的模型也可以适用于传统的供应链业务和企业对企业外部网,因为在这些应用中,企业也是需要将其销售、产品等信息发布到供货商或者合作伙伴。
WDDX由两大部分组成,第一部分是根据XML 1.0 DTD规范制定的一种语言独立的数据描述,第二大部分是为那些使用WDDX的语言而制定的一组模块。熟悉Web应用的人都知道,目前Web领域几乎所有的标准的开发环境(如ColdFusion,Perl,ASP,Java,JavaScript,PHP,etc)都包含内在数据结构,比如数组(array)、 纪录集(record sets)和数据对(value pairs)。 WDDX为每一种语言提供了一个模块,可以自动地将这些内在数据结构加以序列化或者翻译成一种精炼的基于XML的描述;反之亦然。举个典型例子,利用WDDX程序员可以在ColdFusion中获取一个复杂数组的值,将其序列化成为XML,然后将其发送给ASP服务器,最后再通过反序列化将XML转换成一个VBScript的数组对象,而原先的所有数据类型都被无损转换。这样一来,通过将所有的XML处理和交互过程转移至WDDX模块中,开发者就不必再对XML文档本身进行编程和处理,从而使得这种语言之间的转换过程对于开发者相对更加透明。
WDDX的开发需要借助WDDX SDK。WDDX SDK是一个软件开发包,它允许Web应用开发者使用WDDX开发分布式Web应用和Web网络联盟。WDDX SDK同时也是一种自由软件,它在http://www.wddx.org/网站发布。 WDDX并不需要开发者事先了解如何使用XML。WDDX的一个重要优点就是开发者可以在Web上任意交换结构化数据而不必直接编写XML,从这个意义上讲,WDDX是一种"XML中间件",编程语言是将其做为一种在数据间交换的传送工具来使用。目前WDDX SDK包含了一些模块,用以提供对多语言的支持。WDDX同时也适用于非Web应用或Windows应用。将WDDX同COM相结合,开发者可以使用任何流行的Windows应用开发环境,包括Visual Basic、Delphi、PowerBuilder、C++和Java,进行分布式数据访问和数据存储。
在数据传输方面,WDDX广泛支持基于原文数据传输的协议,如HTTP、SMTP、POP、FTP等等。由于WDDX是建立在XML和HTTP的核心之上,因此也就相应继承了Web环境的安全性模型。WDDX数据包可以在具有SSL的HTTP上安全传送,并且由于WDDX数据包仅仅是一些数据串,因此,开发者可以非常方便地利用加密技术对其进行加密和解密。开发者构建能够远程访问需要授权的WDDX数据的分布式应用时,将需要利用Web服务器或应用服务器内在的验证机制以及面向用户的安全服务。
一般来说,任何需要通过Web同其他应用共享数据的应用都可以利用WDDX来构建。比较典型的应用是Web网络联盟和企业对企业内部网和外部网应用,因为在这些应用中企业都需要发布数据,如产品信息、供应链数据、客户数据、订单数据等等。由于WDDX是语言独立并且是通过HTTP传送,因此开发者可以利用ColdFusion或者ASP构建应用,并且发布数据到支持WDDX的过程应用中,再由这些过程应用使用Perl,ColdFusion,ASP或者其他支持WDDX的语言来访问数据。这样一来,就消除了在使用不同语言环境的合作伙伴间共享数据所造成的开销和复杂度。除此之外,连接传统Windows桌面系统和Web系统的应用也可以利用WDDX来构建,这对于那些涉及重要的、离线数据输入与收集的应用很有用。
最后,我们将WDDX同其他相关技术作一个简单的比较。
首先来看一下WDDX同标准的XML数据存取的区别。标准的XML数据存取利用DOM API访问和管理XML文档,而在DOM开发模型中,开发者可以通过编程对任意的XML文档结构进行存取。利用WDDX,开发者不会直接操作XML数据,而是借助特定的语言模块对从其他语言转换来的数据进行存取。通常情况下,基于DOM的XML数据存取同基于WDDX的数据交换具有不同的适用范畴。
关于WDDX同Vignette的ICE的比较。ICE是一种由Vignette开发和赞助的技术,主要用于在Web上进行Web内容联盟。ICE 是以事先预定好的并且互相信任的前提为基础,在有内容交易的合作伙伴间构造起一种特定的应用用以共享内容。ICE不适用于做为一种跨语言的通用协议,而WDDX 本身也不能象ICE那样做为一种结盟应用。但是,通过定制的Web应用却可以利用WDDX同其他Web应用共享数据,进而构建Web结盟网络。
我们再来看一下WDDX同WebMethods的WIDL的比较。Web接口定义语言(WIDL)是WebMethods制定的一种基于XML技术,用于描述一种同现有的文档(如HTML或XML文档)的编程接口。WIDL本身并不是一种在编程语言间交换数据的技术,相反,WDDX却可以在编程语言间实时地交换数据,虽然不会从现有的Web内容中提取数据。 下面是WDDX同XML-RPC机制的比较。RPC的意思是远程过程调用,它是一种用于分布式对象系统如DCOM和CORBA的机制,而XML-RPC机制,如DataChannel的WebBroker,致力于利用XML和HTTP以提供一个完全分布式的对象协议。介于二者之间,WDDX则是用于为Web编程语言提供一个简单的、轻型的数据交换机制。
WDDX技术相关的网址是:http://www.wddx.org/
9.4.1.1 MS SQL Server
开发基于XML的动态应用,如动态信息发布、动态数据交换等,前提是必须有数据库的支持。在这一方面,Oracle和Microsoft走在其他厂商的前面,Oracle做为全球第一大数据库及数据库应用解决方案提供厂商,早在1999年就率先推出支持XML的数据库产品——Oracle 8i。在这一章,我们来简要地介绍一些对XML提供支持的数据库。就在XML技术在全球日益盛行的时候,Microsoft于2000年1月宣布其SQL Server对XML提供支持,并且发布了一个预览版本。由此可以看出Microsoft在其战略决策上将XML技术放在一个何等重要的地位,而这一消息的发布无疑将给广大的XML技术人员和SQL Server用户带来了强劲动力。
Microsoft SQL Server的XML支持计划,是其下一步庞大计划的一部分,即旨在产生一组功能强大的产品和服务来实现所谓的BizTalk框架。BizTalk是Microsoft现有的、帮助商务公司实现应用软件一体化的分布式互连网应用DNA (Windows Distributed interNet Applications )体系结构的延伸和扩展。以后的Microsoft产品和工具本身都将包含对BizTalk服务体系结构的支持。Microsoft Commerce Platform、Office、BackOffice 以及Windows 都将利用BizTalk XML Schema来保存文档的额外信息,并且用它来实现BackOffice和基于Windows应用软件的一体化集成。Microsoft产品套件、Microsoft Office 2000发行的下一个主要版本都打算将HTML提升成为一种内置支持的文件格式,并且使用XML来存储额外的文档信息。Microsoft SQL Server正是其实现这一目的的底层数据管理的有力工具。
在此之前,Microsoft就一直致力于将XML技术同其数据库旗舰产品SQL Server相集成,以帮助建立下一代的高效的基于Web的企业应用。Microsoft宣称,其下一版本SQL Server,即代号为Shiloh,将是一个完全支持XML的产品,利用该产品,用户可以在Web浏览器下输入一个URL地址,即可访问SQL Server数据库,而返回的结果可以是一个XML文档。另外,它还允许通过输入样式参数,指定样式信息,以便在浏览器中输出丰富的页面。例如,一个典型的URL如下所述:
href=http://localhost/Northwind?sql=select+name,id, company,email +from+clientList+for+xml+auto
XML SQL技术预览提供了以下几种XML访问功能:
利用HTTP协议以URL的方式访问SQL Server数据库。这是最基本的访问方式。另外,通过指定样式模板参数,可以返回具有一定样式信息的数据。该样式模板是一个包含一条或多条SQL 语句的合法的XML文档。返回的XML文档可以通过指定的XML模式来定义,三种模式为:RAW、AUTO、EXPLICIT。
利用在SELECT语句中附加FOR XML返回XML格式数据。作为对XML模式的一种补充,通过在FOR XML中指定DTD或XML schema来达到对返回XML文档的格式化。
利用基于XML的UPDATE语句来更新数据库中的记录。SQL Server支持基于XML的插入、删除、修改等数据库更新操作。通用的更新语法是:
<sql:sync xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <!-- 用于删除和修改操作中 --> <sql:before> <TABLENAME <!-- 数据表名 --> [sql:id="value"] <!-- 仅用于修改操作中 --> col="value"col="value"… /> </sql:before> <!-- 用于插入和修改操作中 --> <sql:after> <TABLENAME <!-- 数据表名 --> [sql:id="value"] [sql:at-identity="value"] <!-- 仅用于插入操作中 --> col="value" col="value"… /> </sql:after></sql:sync>
利用对象模型在Script脚本程序中实现同样的功能。XML SQL技术预览提供的osqlxml.dll允许利用对象模型在Script脚本程序中实现基于XML的数据库操作。下面是一个ASP示例:
<%@ LANGUAGE = VBScript %><% Response.ContentType = "text/xml" %><% SET oSQLXML = CreateObject("Microsoft.SQLXMLRequest") oSQLXML.Connection = " Driver=SQL Server; Server=FRANKMAN-CAVE; Database=Northwind; uid=sa;pwd= " oSQLXML.ExecuteQuery("Select * from customers for XML AUTO") Response.BinaryWrite oSQLXML.ResultAsBinary %>
XML SQL 技术预览展示了Microsoft在XML技术应用上的实力,通过将XML同数据库相结合实现了强大的功能。但是,由于该技术目前只是一个预览版本,其本身还会不断发展,相信在正式发布时将会有所改进。
9.4.1.2 Oracle 8I
Oracle公司在其最新的Oracle 8i数据库产品中提供了对XML的支持,使其成为开发基于XML的Internet应用的系统平台。作为Oracle 8i数据库的一个主要组成部分,Java版本的XML SQL实用工具在Oracle公司的XML战略计划中扮演着重要角色。该工具包包含了一组Java类,可完成下述两大功能:
向数据库发送查询语句,然后从返回的结果中输出XML文档(文本或DOM节点树)。
将XML数据保存至数据库。
这两大功能可以说是SQL 数据库支持XML的最基本要求,却足以体现当今XML技术发展的潮流。微软宣称在其下一代数据库产品Microsoft SQL Server "Shiloh"中也提供类似的支持,但其正式版本尚未发布。因此,无形之中,Oracle占据了良好的先机。
Oracle Java版本的XML SQL 实用工具具有下列特性:
能够从SQL查询中产生XML文档。
能够从SQL查询语句或JDBC ResultSet对象中输出文本或文档对象模型节点树(DOM)。
能够将XML文档数据写入数据库表或视图中。
支持W3C的XML 1.0推荐标准。
可以通过扩展进而支持SAX 1.0 文档访问。
支持基于下列字符集的文档: UTF-8、UTF-16、ISO-10646-UCS-2、ISO-10646-UCS-4、EUC-KR、US-ASCII 、EBCDIC-CP-*、ISO-8859-1to -9、BIG 、GB2312 、EUC-JP 、KOI8-R 、ISO-2022-JP 、 ISO-2022-KR 、Shift_JIS
XML SQL 实用工具输出的XML文档实际上根据数据库表内在结构动态确定。比如,将ROWSET做为返回结果集的根元素,每行数据将ROW做为元素标记,而每个字段名称都将做为ROW元素下的子元素。下面给出一个典型示例:
假定查询语句为:
SELECT Name, ID, Company, Email FROM clientList
则可能返回如下的XML文档:
<? xml version = "1.0" encoding="GB2312" ?><ROWSET> <ROW id="1"> <Name>张三</Name> <ID>1</ID> <Company>A公司</Company> <Email>zhang@aaa.com</Email> </ROW>
<ROW id="2"> <Name>李四</Name> <ID>2</ID> <Company>B公司</Company> <Email>li@bbb.org</Email> </ROW></ROWSET>
XSQL Servlet是Oralce XML开发工具包的重要组成部分,它实际上是一种Java的服务器端小程序,利用Java版本的XML SQL 实用工具将关系数据库中数据转换为XML文档。XSQL Servlet属于模板驱动类型,应用时需要将SELECT查询语句作为<query>元素嵌入到模板中,当查询处理完成后,这些内嵌的元素将会被返回的结果所替换,最终输出成为一个XML文档。另外,它还支持通过HTTP传送查询参数以及利用XSL将输出结果样式化,通过XML、SQL、XSL三者的结合从而产生动态的Web页面。 相关网址:http://technet.oracle.com/tech/xml
9.4.1.3 Informix
随着XML逐渐受到越来越多的重视,Informix公司也发布了其XML策略:快速、简便地构造高性能、可缩放、基于XML数据驱动的Internet应用,支持和加速开放标准。
首先,Informix公司在其数据库产品Informix中加入XML支持。作为Informix Internet Foundation 2000的一部分的Informix Web DataBlade模块,可以通过一个简单的SQL接口产生动态的XML数据和文档。
另外,Informix还开发了一种称作XML Mapper的应用,它使得开发者可以在Informix数据库中存储和检索XML数据。利用一组SQL表格和一个XML文档模板,XML Mapper能够自动生成文档对象代码。例如,假定有两个数据表(作者和图书)以及一个包含作者信息的XML模板,那么,就可以产生一个内置存储和检索XML功能的Java类。一般情况下,在该Java代码中会有两个关键的方法实现:getXML和setXML。在前面我们所做的假定条件下,getXML方法可以返回一个包含作者数据的字符串,而setXML则可借助XML模板进行数据库中数据的插入和修改。Informix XML Mapper 还可以生成一个servlet,它能够从数据库中取得数据,然后在Web浏览器中显示。相关网址:http://www.informix.com/xml/
9.4.2.1 Xhive
XHive是由The Connection Factory 开发的XML数据库产品,该数据库是建立在一种面向对象数据库管理系统Objectivity基础之上的。它提供了对事务、缓存、会话池、安全性以及数据和文档的版本控制等机制的支持,另外,还支持XML DOM、XPath、XPointer和XLink的实现。Xhive能够访问JDBC数据库中的数据,除此之外,它还内置了一系列工具用于编辑、管理、装载数据和构造查询语句。尽管Xhive可以用作XML数据库,但是它更多地将被作为下一代文档存储应用的存储引擎。相关网址:http://www.xhive.com/
9.4.2.2 XML Repository
XML Repository是由ozone-db.org开发的一种带有公开源代码性质的XML数据库,该数据库建立在ozone面向对象数据库和MonsterDOM技术的基础之上。对于一组给定的文档,用户可以指定其中每一个文档在分层结构中的位置,就象它们存储于文件系统之中一样。文档之间是相互独立的,但是可以通过其存储路径来访问。尽管每个文档在数据库中仅仅存储一次,但是通过一种类似于UNIX文件系统中符号连接的机制,使得它们可以在分层结构中的不同位置出现。XML Repository的这种机制使得数据库中的文档可以运用XPath来进行查询和定位,进一步扩展了XML文档。
相关网址:http://www.ozone-db.org/xml-repository/xml-repository_contents.html
9.4.2.3 eXcelon
eXcelon公司是总部设在美国Burlington, MA的一家公司,原名Object Design。该公司专门为那些通过Internet进行动态B2B电子商务交易的公司提供相关产品和服务。 eXcelon公司的动态B2B解决方案号称是完全基于标准的,它通过将XML应用于其产品之中,可以帮助客户建立高效的运行环境,从而为选用该方案从事Internet上交易的公司消除了技术上的壁垒。而eXcelon则是eXcelon公司推出的一个XML应用开发环境和发布平台,主要用于开发电子商务应用。eXcelon框架结构包括:eXcelon工具箱、eXcelon数据服务器、eXcelon Xconnects。
500)this.width=500'>
eXcelon工具箱:开发基于XML电子商务应用的集成工具包,简单易用,可以开发数据驱动的Web页面和XML应用。其中又包含了四个工具:
eXcelon Studio能够可视化地定义XML Schema、生成HTML Form、数据驱动的Web页面、XSL 样式单以及eXcelon服务器扩展。
500)this.width=500'>
eXcelon Explorer可以用于存储、查询、组织、更新(包括增加、删除、修改)XML数据。
| |
|
|
|