Domino数据库导出XML需手动实现:禁用DXL元数据或用LotusScript逐字段构造,注意字符转义、日期格式、附件Base64清理及分批上传防超时。

导出前确认 Domino 数据库是否启用 XML 导出支持
Lotus Notes/Domino 本身不提供开箱即用的「一键导出 XML」功能,NotesDatabase 和 NotesView 对象没有原生 exportToXML() 方法。你实际能用的路径只有两条:一是通过内置的 @Command([ToolsExport]) 配合预设的 DXL 导出模板(DXL 是 Domino 的 XML Schema,不是通用 XML),二是用 LotusScript/Java Agent 手动构造 XML 文档并写入文件。
关键判断点:如果目标新系统只接受自定义 XML 结构(比如含 而非 ),就不能直接用 DXL 导出——它结构固定、嵌套深、带大量元数据,解析成本高且难映射。
- 检查数据库属性 → “高级”选项卡 → 勾选“允许通过 Web 访问此数据库”,否则 Web Agent 或 HTTP 导出不可用
- 确认服务器启用了
HTTPJAVAMAXHEAPSIZE(Java Agent 内存不足会导致 XML 构造中途崩溃) - DXL 导出默认包含
、等无关内容,必须用-d参数禁用:load convert -d mydb.nsf(命令行工具)
用 LotusScript Agent 生成结构可控的 XML
这是最稳妥的方式:绕过 DXL,用 NotesStream + NotesXMLProcessor 或纯字符串拼接,按需输出字段。注意 NotesXMLProcessor 实际是把 Notes 文档转成 DXL,所以仍不适用;推荐直接用 Print 写入 NotesStream。
常见坑:NotesRichTextItem 中的换行、特殊字符(如 &、Replace,否则 XML 解析失败;日期字段要用 Format$(doc.DateField(0), "yyyy-mm-dd"),不能直接拼 CStr()。
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim stream As NotesStream
Set db = session.CurrentDatabase
Set view = db.GetView("ExportView")
Set stream = session.CreateStream
Call stream.Open("C:\export\output.xml", "UTF-8")
Call stream.WriteText( & Chr(10))
Call stream.WriteText( & Chr(10))
Set doc = view.GetFirstDocument
Do Until doc Is Nothing
Call stream.WriteText( & Chr(10))
Call stream.WriteText(Replace(doc.FirstName(0), "&", "&") & Chr(10))
Call stream.WriteText(doc.Email(0) & Chr(10))
Call stream.WriteText( & Chr(10))
Set doc = view.GetNextDocument(doc)
Loop
Call stream.WriteText()
Call stream.Close
End Sub
上传时避免 HTTP 413 或超时:分批 + 设置超时
Domino 服务器默认限制单次 POST 大小为 10MB(MaxPostSize=10000),且 Java Agent 默认超时 60 秒。导出 5000+ 条记录的 XML 很容易触发这两个限制。
- 在服务器文档中修改
notes.ini:添加MaxPostSize=50000(单位 KB)和JavaMaxHeapSize=1024M - 上传代码里必须分片:每 200 条文档生成一个 XML 文件,用循环调用
URLConnection或curl - 若用
curl上传,务必加--max-time 300 --connect-timeout 30,否则网络抖动直接中断 - 不要依赖
session.DocumentContext在 Web Agent 里读取大 XML —— 它会加载整个 body 到内存,OOM 风险极高
新系统接收端校验 XML 格式的关键点
很多团队只关注导出,却在上传后发现新系统报 XML Parse Error: EntityRef: expecting ';' 或 Invalid character in entity name。根本原因不是 Domino 导出错,而是字段值里混入了控制字符(如 ASCII 0x00–0x08、0x0B–0x0C、0x0E–0x1F)或未转义的 Unicode 替代对(surrogate pairs)。
LotusScript 没有内置的 XML 安全清理函数,必须手动过滤:
- 用
AscW()遍历每个字符,剔除AscW(ch) 9 And AscW(ch) 10 And AscW(ch) 13 - 对富文本字段,先用
doc.GetFormattedText(False, 0)提取纯文本,再清理 - 上传前用 Python 快速验证:
python -c "import xml.etree.ElementTree as ET; ET.parse('output.xml')"
真正麻烦的是二进制附件(如扫描件)的 Base64 编码处理——Domino 的 EmbeddedObject 输出的 Base64 可能含换行符,而标准 XML 不允许。必须用 Replace(encoded, Chr(10), "") 清掉所有换行再写入 。










