Domino R6中,能够将设计元素导出并产生一个DXL(Domino XML)文档,导出之后,咱们能够经过程序代码将DXL文档进行修改,再将修改后的代码导入到Domino数据库。这种方式能够修改设计元素中的任何代码(好比:添加/删除表单中插入的子表单、修改代理中的代码、增长删除视图中的列等)。
须要注意如下几点:
一、代理从新导入后
a)打开设计时,会提示代理没有签名,没法打开,在Web上运行代理的时候,服务器当即宕机。解决方法:用程序打开设计元素文档,并对其进行签名。
b)若原代理设置了两个名字(如:“保存代理|AG_SaveDoc”),导入后代理的名字会被修改成“保存代理 | AG_SaveDoc”,在设计页面中,代理的英文名前面自动加了一个空格,但这样并不影响代理的调用,只是在KOA的接口中没法正常获取到该设计。解决方法:用程序打开设计元素文档,修改$Title域。jquery
二、视图从新导入后,若视图的名称(注意,不是别名)产生有冲突,导入的视图会自动被重命名为“原视图名字”+“/”+“当前用户帐号”(如:“按部门”会被修改成“按部门/CN=雪浪狐/O=Dev”),若被重命名后的名字仍然有冲突,这样,在导入的程序中就报DXL导入失败的错误。解决办法:用程序打开设计元素文档,修改$Title域。数据库
三、当导出的设计代码比较多的时候,导出代码到内存的时候,会有必定的延缓,若后续的代码直接访问内存中的变量的时候,每每容易发生错误。解决方法:将导出的代码先放到一个临时的文件中,而后在从文件中读取内容到内存中。服务器
代码样例片段:dom
导入代码程序ide
Dim exporter As NotesDXLExporter
Dim stream As NotesStream
Set view = db.GetView("SYS_VH_DesignByName")
Set doc = view.GetDocumentByKey(elemName, True)
If Not doc Is Nothing Then
Set stream = ss.CreateStream
Call stream.Open("c:\$$lksdesigninfo.dxl", "UTF-8") '导出文件为了解决前面说起的缓冲问题
stream.Truncate '清空文件中原有的内容
Set exporter = ss.CreateDXLExporter(doc, stream)
Call exporter.Process '将代码导出到文件中
stream.Close
Set stream = ss.CreateStream
Call stream.Open("c:\$$lksdesigninfo.dxl", "UTF-8")
elementCode= stream.ReadText '读取文件内容
'如下代码获取该设计元素的XML片段
elemType = Strrightback(rtnVal, "</")
elemType = Strleft(elemType, ">")
elementCode = "<" & elemType & " " & Strright(elementCode, "<" & elemType & " ")
elementCode = Strleftback(elementCode, ">")
If elementCode <> "" Then
elementCode = elementCode & ">"
End If
Call stream.Close
Kill "c:\$$lksdesigninfo.dxl"
End If
导入代码程序post
Dim stream As NotesStream Dim importer As NotesDXLImporter codeTxt = {<?xml version='1.0' encoding='utf-8'?>} & Chr(10) codeTxt = codeTxt & {<!DOCTYPE database SYSTEM 'xmlschemas/domino_6_5_3.dtd'>} & Chr(10) codeTxt = codeTxt & {<database xmlns='http://www.lotus.com/dxl' version='6.5' maintenanceversion='3.0'>} & Chr(10) codeTxt = codeTxt & elementCode '将前面获取的元素代码XML片段加入 codeTxt = codeTxt & "</database>" & Chr(10) Set view = db.GetView("SYS_VH_DesignByName") Set stream = ss.CreateStream Call stream.WriteText(codeTxt) '在流中写入代码信息 Set importer = ss.CreateDXLImporter(stream, objDb) importer.DesignImportOption = DXLIMPORTOPTION_CREATE '设置以新增的方式导入设计 Call importer.Process '导入 Call stream.Close If Isarray(newList) Then 'newList中保存了刚导入的全部设计元素的名称 newList = Com_UniqueTrim(newList) Forall o In newList Set doc = view.GetDocumentByKey(o, True) If doc Is Nothing Then Set doc = view.GetDocumentByKey(" " & o, True) '代理中的元素名称中可能会被添加了空格 End If If Not doc Is Nothing Then If doc.HasItem("$TITLE") Then '修改设计元素中的$TITLE域 title = doc.GetItemValue("$TITLE") hasChg = False If Instr(title(0), " | ")>0 Then title(0) = Com_ReplaceSubstring(title(0), " | ", "|") hasChg = True End If If Instr(title(0), "/CN=")>0 Then tmpStr = Strright(title(0), "/CN=") If Instr(tmpStr, "|") Then title(0) = Strleft(title(0), "/CN=") & "|" & Strright(tmpStr, "|") Else title(0) = Strleft(title(0), "/CN=") End If hasChg = True End If If hasChg Then Call doc.ReplaceItemValue("$TITLE", title) End If End If Call doc.Sign '对设计进行签名 Call doc.Save(True, True) End If End Forall End If