大家好,才是真的好。
DXL全称叫做Domino XML Language,是2002年Domino R6发布时推出的一项功能。可以将Notes和Domino应用程序中的文档数据和设计元素等以XML表示。
如果你对DXL较为感兴趣的话,可查看我们去年写的一篇《了不起的DXL!》。
今天我们谈谈利用DXL技术对附件进行处理操作。
一般如果是企业内部系统之间交换附件,则有办法,比如将附件拆到共享盘中,或者直接发送过去。
但如果是不同企业,或不同系统之间使用较为便捷的RESTFUL API进行数据交换,尤其是附件,则一般我们建议将附件转换为字节流,然后POST过去,对方收到以后再以字节流方式进行文件输出,例如在Java中可使用FileOutputStream将字节流还原为文件;LotusScript也可以使用stream类来进行操作。
在这个过程中,将Notes文档中的附件转换为字节流,传统的方式是使用LotusScript的NotesRichTextItem和NotesEmbeddedObject类方法(也可以使用Java中的类似方法),先下载附件,再使用LotusScript中的notesstream或Java中的stream类将文件处理为字节流。
其实我们可以更简单,直接采用Domino中的DXL将文档附件输出为XML文件,这其中附件将会自动转换为XML中的字节流。
我们举个例子来看,下列代码将用户选中的第一个Notes文档处理为DXL文件:
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim coll As NotesDocumentCollection
Dim stream As NotesStream
Dim DXLfilename$
Dim BasePath$
Dim doc As NotesDocument
Dim exporter As NotesDXLExporter
BasePath="c:\"
Set db = session.Currentdatabase
Set coll = db.UnprocessedDocuments
If coll Is Nothing Then Exit Sub
Set doc = coll.getfirstdocument
If doc Is Nothing Then Exit Sub
Set stream = session.CreateStream
DXLfilename$ = BasePath$ & doc.universalid & ".dxl"
Msgbox DXLfilename$
If Not stream.Open(DXLfilename$) Then
Messagebox "Cannot open " & DXLfilename$,, "Error"
Exit Sub
End If
Set exporter = session.CreateDXLExporter
Call exporter.SetInput(doc)
Call exporter.SetOutput(stream)
Call exporter.Process
End Sub
输出的DXL文件内容我们可以打开看看,里面包含一个附件,其数据结构应该如下图所示:
最重要的是我们上图所标注的Notes文档中的附件,即和标签之间的内容,以Base64进行编码的字符进行表示。
现在,我们可以利用如下代码将该字符提取出来,然后解码显示出来,你还记得前几篇我们的《Lotusscript中的Base64处理》吧?
Dim base64str As String
Dim attachfilename As String
Dim attachfilepath As String
base64str = Strright(Strleft(stream.ReadText, "</filedata>"), "<filedata>")
Msgbox DecodeBase64(base64str)
效果如下图:
也可以将该附件文件保存在磁盘某个位置,利用下列代码:
Set newdoc = db.CreateDocument
Set doc = db.CreateDocument
session.ConvertMime = False
Call newstream.WriteText(base64str,EOL_NONE)
Set mime = newdoc.CreateMIMEEntity
Call mime.SetContentFromText(newstream, "application/octet-stream", ENC_BASE64)
Call mime.DecodeContent
If Not(mime Is Nothing) Then
pathname$ = "c:\temp\test.txt"
If Not stream.Open(pathname$, "binary") Then
Messagebox pathname$
Exit Sub
End If
Call mime.GetContentAsBytes(stream)
Call stream.Close
End If
我们就能得到下载好的附件:
实际上你并没有必要这么来进行操作,直接存下来可能更简单,但本文的主要目的是能够将附件发送到第三方以进行数据交换,因此具备应用意义。
在实际过程中,你可能会碰到多个附件处理、中文字符乱码、配置的环境等各个方面因素影响,不过本篇就就基本的技术实现进行了讨论。
下一篇我们要等到五一之后和大家见面,祝大家五一愉快。
今天我们就讲到这里吧。
更多精彩文章,请关注微信公众号:协作者