DOMINO应用系统中异构数据交换技术的研究与实现
作者 : 未知

  摘要:Domino系统提供了丰富的类和方法来支持其与异构数据库进行数据交换,本文通过分析基于Domino系统办公自动化系统信息共享的特点,探讨了Domino系统的三种异构数据交换方法,对三种方法不同的特点进行了分析,并就其具体实现进行了描述。
  关键词:DOMINO;异构数据;交换技术;XML
  中图分类号:TP317.1文献标识码:A 文章编号:1009-3044(2007)04-10918-03
  在一些大范围的办公应用系统中,存在着许多基于异构数据源的应用系统,不同应用系统之间需要进行数据交换。在本文所涉及的政府部门实际案例应用中,Domino应用系统提供了政府部门网上信息发布审批流转的处理平台,审批处理后的信息需要转化为以一种具有通用性、简单性、易转换性特点的方式来存储,并提供给由异构平台构筑的政府专网和外网的信息发布系统中,这样就必要研究Domino系统与异构系统的数据转换技术。事实上,XML技术已经成为异构数据转换的中介与标准[1],XML具有数据交换简单、可定制标记语言、数据可以实现结构化存储等特点,特别是其可自描述特性,它使控制信息不是采用应用软件的独有形式,而是采用简便易懂的标记形式来表现[2],在表达数据信息时,XML通过文本形式来描述,容易越过不同平台的障碍进行正常的数据交换。正因为这些优点,Domino系统与异构系统通过XML实现数据转换也就成为一种必然。本文着重分析了Domino系统中的二种XML数据转换技术,实现了Domino系统中Notes数据库文档的XML文本格式转换。同时,还分析和实现了Notes数据库文档中附件的输出转换技术。
  
  1 Domino系统中的数据交换技术分析
  Domino系统采用文档型数据库[3],数据库的基本元素就是文档本身,文档可以同时包含结构化的和非结构化的信息,所以,Notes能够存储和管理非结构化数据,在数据库中,可以任意为记录添加字段,添加列表型的字段,处理RTF域、附件这样的大对象。数据处理非常灵活,当然这样也在一定程度上影响了效率。而对于传统型关系数据库,它们以结构化的方式存储数据,数据库具有冗余度低、程序与数据独立性较高、易于扩充、易于编制应用程序等特点。因此,要实现Domino系统与其他异构数据库的数据转换,必须能够把Domino系统中的非结构化信息以结构化的方式来表达出来,对于一般的文档对象,我们完全可以把其中的数据信息和结构抽取并输出到XML文件中来实现数据交换,但是,以附件形式存储在Domino系统中的图像、声音等非结构化数据,简单的输出并不能解决问题,因此可以采取直接输出的方式,把它们以文件的形式从Notes文档中剥离出来,以实现数据的交换。
  Domino系统本身具有高度的数据集成性,它为数据信息的XML输出提供了良好的支持,特别是Notes/Domino 6,它提供了一系列新的XML相关类来实现各种XML格式的输入和输出,其主要结构如图1所示[4]:
  图1 DOMINO XML相关类
  Notes/Domino 6的XML相关类主要分成三个部分:
  (1)DXL相关类,它包括NotesDXLExporter、NotesDXLImporter 两个类,这二个类可以实现DXL(Domino XML)文件的输入和输出,DXL是DOMINO系统中的内部XML文件, DOMINO系统可以对其进行直接的识别和操作;
  (2)XML处理类,它包括NotesXSLTransformer、NotesSAXParser、NotesDOMParser等类,通过它们,我们可以实现NOTES的NSF文件对不同XML文件的格式支持;
  (3)辅助类,包括NotesNoteCollection、 NotesStream类,其主要作用是进行XML文档选择和生成XML文件。
  
  2 Domino系统中的数据交换技术输出实现
  2.1 用Domino相关输出类来实现XML输出
  基于Domino中XML输出类的类型,DOMINO可以直接输出以下几种格式的XML文件[5]:
  (1)DXL:(Domino XML)是属于DOMINO内部可以直接识别的XML文档,对NOTES系统是最好的兼容性;
  (2)XSLT(Extensible Styles Language Transformation):用于对XML文档进行格式化,实质上XSLT是一种用来转换XML文档结构的语言;
  (3)DOM (Document Object Model):它是一种文档平台,它允许程序或脚本动态的存储和上传文件的内容,结构或样式 ,它以层次结构组织的节点或信息片断的集合。这个层次结构允许人们通过加载整个文档和构造层次结构来在树中寻找特定信息;
  (4)SAX ( Simple API for XML): SAX通过一系列的事件来执行相应的操作,当SAX解析器遇到一个元素时,它可以把其当成一个事件对待,来调用相应的代码来访问储存在XML文档中的信息。
  以上几种XML格式,其实除DXL格式外,其他三种均是基于DXL而输出的。下面,我们以Notes文档的DOM输出为例来说明Domino系统的XML输出。对于DOM的输出来说,它的实现主要由NotesSession、NotesDXLExporter、NotesStream、NotesDXLExporter等相关类来实现,具体步骤如下:
  (1)通过NotesSession对象的CreateStream方法生成输出文件
  Set outputStream =session.CreateStream
  outputStream.Open (outputFile)//outputfile为生成的文件名
  (2)制定XML文件生成规则,即通过相关FORMULA语言的选择来确实要输出哪些结点。
  query=“......”
  nc.SelectionFormula =|@contains|+|(|+|unid|+|;|+query+|)|
  (3)创建DXL输出器和DOM解析器、处理器
  Dim exporter As NotesDXLExporter
  Set exporter = session.CreateDXLExporter(nc)
  Set domParser=session.CreateDOMParser(exporter, outputStream)
  (4)遍历Notes文档,生成各个树结点,并输出。
  Select Case node.NodeType
  Case DOMNODETYPE_DOCUMENT_NODE:process….
  :
  domParser.Output( )
  End Select
  通过Notes中现成的类来生成XML,比较简单、方便,但由于其是其是基于对原有的文档进行分析来生成XML文件,它的运行是在服务器上的,也就是说,它所生成的XML文件存在于服务器上。由于安全控制方面的原因,这样无疑就给用户拷贝文件造成了不便,因此,我们可以考虑用第二种方式,即利用JAVASCRIPT来读取文档中现成的域,实时生成XML文档,达到我们在本地生成XML输出文件的目的。
  2.2 JavaScript输出XML的实现
  对于以B/S方式运行的Domino系统来说,我们可以通过在Notes表单中放入相应的域,在运行表单时,把需要输出的XML文件内容写入此域中,再用JavaScript在网页中读入域内容并写入文件的方法来达到输出XML文件的目的, JAVASCRIPT是基于本地进行操作的,因此,这也就保证了XML文档可以在本地生成,其具体步骤如下:
  (1)添加一个WebQueryOpen代理,其作用是在打开Notes文档时,对文档进行遍历,取出符合输出条件的域的值,生成XML格式 文本,把他们传给一个NSF文件中的一个域
  Forall i In docCur.Items//遍历文档中的域
  Select Case i.name
  Case "FileTitle”:tem=“TITLE” //将要输出的域名转化为指定标记
  ……
  End Select
  End Forall
  xml=xml+""+i.text+"“ //将域中的值加入到字符串中
  docCur.xml=xml//将此字符串值符给表单中的一个RTF文本域
  (2)通过JavaScript来读取打开的Notes文档的域值,把其写入到JavaScript在本地生成的一个文件中。
  fso = new ActiveXObject("Scripting.FileSystemObject"); //生成文件对象
  f = fso.CreateTextFile(destination , true);//生成输出文件
  ShowedInfo = document.getElementById( "xml" ).innerText;
  f.Write ( ShowedInfo );//读入xml域中的值并把其写入文件
  2.3 附件输出的实现
  对于文档中附件的输出来说,Domino系统提供了现成的GetAttachment、Extractfile的方法来实现,我们可以通过GetAttachment取得当前文档中NotesEmbeddedObject对象
  Set attach = docCur.GetFirstItem( "AttachmentName" )
  // AttachmentName 为域名,它通过@AttachmentNames命令来取得当前文档中附件名的集合
  Set object = docCur.GetAttachment(attach.values(a))
  通过Extractfile方法来把NotesEmbeddedObject对象中的附件来释放到相关路径下:
  Call object.Extractfile(tmppath+attach.values(a))
  和DOM输出一样,这种方法是基于Domino内部的类和方法来实现的,它所面向的是对服务器进行的操作,所生成的文档也是存在于服务器上,因此为了使客户可以使用文档中的附件,有必要通过JavaScript来把生成的文档下载到本地,其代码如下:
  Agent process
  ……
  Print| |
  Print|fso = new ActiveXObject("Scripting.FileSystemObject");|
  Print| fso.CopyFile (source, destination)|
  Print| |
  
  3 结束语
  事实上,本文所描述的Domino系统异构数据交换技术实现已经在某政府部门的电子政务系统中得到很好的应用。该应用案例的网络运行环境是:内网应用由Domino系统平台构筑,专网和外网应用由.Net平台和Sql Server数据库构筑。实践证明,如果用Domino系统的内部类来实现XML的输出,具有简单、方便,且与Domino系统兼容性好的特点,但是由于其代理是在服务器端运行的,需要占用服务器的资源,在大量处理数据,特别是许多用户执行程序时,效率并不很高。另外,基于实际运用的需要,用户也不希望把生成的XML文档存于服务器上,这些都是这种方法的局限性。对于JAVASCRIPT来说,它采用直接读取相关域的方法来生成XML文档,比较简便,而且程序是在本地运行,大大减轻服务器的负担,但是,由于这种方法涉及到了对文件进行操作,因此,它要求系统在安全性方面必须保证允许SCRIPT语言进行文件的读写,这样就给系统造成了很大的安全隐患,特别是附件的输出,它在DOMINO在服务器端生成文件后,使用JAVASCRIPT来读取、传输附件文件,这不仅涉及到本地的操作,也涉及到了对服务器端的操作,安全性的问题更加突出。
  基于以上方法的种种不足,我们后面可以进一步利用JAVA在文件流操作方面的优势来实现XML文件的本地输出,因为Domino系统对JAVA提供了良好的支持,一些XML输出类和方法可以直接在JAVA进行重用,利用这些类和方法,JAVA可以直接读出Notes文件中的相关信息,在保证系统安全性的同时达到XML输出到本地的目的。另一方面,在Domino应用网络可以和异构数据库互通的环境下,我们也可以使用Domino系统本身提供的LS:DO(LotusScript Data Object)来实现数据信息的直接交换。作为LotusScript的一个扩展库,LS:DO提供了一系列类,可以实现和支持ODBC标准数据库的连接,因此,我们可以在Domino系统中对不同的异构数据源进行参数设置,生成可配置的文档,这样,用户就可以根据自己所用数据库的类型进行动态选择,系统通过用户的选择来读取配置文档,生成相应的ODBC连接,直接进行数据转换,这也是一种较好的方法。
  参考文献:
  [1] Bray T,Paoli J,Sperberg - Moqueen C M,et al, Extensible Markup Language(XML)1.0[S] [EB/OL]. http://www.w3c.org/TR/REC-XML,2004
  [2] 方翔 李伟生.关系模式到XML模式的影射[J].计算机应用研究,2002(1):130-131
  [3] 王立峰 王珍 李从心 杜晓宁.基于Notes/Domino的数据库文档传输技术的研究[J].计算机应用与软件,2006(9):53-56
  [4] Lotus Notes and Domino Help[S].IBM Corporation,2003.
  [5] Sally Blanning DeJean,David DeJean. LotusScript: XML classes in Notes/Domino 6[S],IBM Corporation,2003.
  本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。