NotesXMLProcessor 入門:LotusScript 處理 XML 的共同基底
NotesXMLProcessor 在 LotusScript 中扮演什麼角色
NotesXMLProcessor 是「所有 XML 處理類別共用的 base class,含共通屬性與方法」。重點是 — 它是個 abstract class,文件原文:「The NotesXMLProcessor class is abstract and you do not create NotesXMLProcessor objects.」要用就一定要透過 NotesSession 上對應的 Create* 方法拿一個衍生類別實例。
版本與限制:Release 6 起加入;不支援 COM(從 LotusScript 用沒問題,但走 COM 自動化就 access 不到)。
五個衍生類別 — 怎麼選
| 衍生類別 | 用途 | 用哪個 Create 方法 |
|---|---|---|
NotesDOMParser | 把 XML parse 成 DOM 樹(在記憶體裡走、改、查) | session.CreateDOMParser |
NotesSAXParser | 把 XML 當事件流處理(適合大檔、不想全部載入記憶體) | session.CreateSAXParser |
NotesDXLExporter | 把 Domino 資料(DB / 文件 / view)匯出為 DXL(Domino XML) | session.CreateDXLExporter |
NotesDXLImporter | 把 DXL 匯回 Domino | session.CreateDXLImporter |
NotesXSLTransformer | 用 XSLT 轉換 DXL | session.CreateXSLTransformer |
選擇原則:
- 要「動 Domino 設計或資料」→ DXLExporter / DXLImporter
- 要「parse 別的系統來的 XML」→ DOMParser(小檔,要隨機存取)或 SAXParser(大檔,stream 處理)
- 要「把 DXL 變成別的 XML 格式」(例如餵給其他系統)→ XSLTransformer
共通屬性(從 base class 繼承)
ExitOnFirstFatalError(讀寫 Boolean)— 遇到 fatal error 是否立刻終止Log(唯讀 String)— 處理過程中產生的 warning / error / fatal error,XML 格式LogComment(讀寫 String)— 寫進 Log 開頭的一段註解,方便事後辨識
Log 是 XML 不是純文字 — 要分析錯誤的話可以再用一個 DOMParser 把它 parse 起來。
共通方法
SetInput— 指定 XML 處理的輸入。接受的型別依衍生類別而異:DXLExporter 接NotesDatabase/NotesDocumentCollection/NotesDocument;DOMParser / SAXParser 接NotesStream/ 檔案路徑字串;DXLImporter 接 DXL 字串 /NotesStream等SetOutput— 指定輸出位置(同樣依衍生類別而異 — 通常是NotesStream或檔案路徑字串)Process— 啟動轉換或解析(同步呼叫,跑完才返回)
範例:把整個 DB 匯出為 DXL
最常見的用法是用 NotesDXLExporter 把當前資料庫整個轉成 DXL 檔:
Sub Initialize Dim session As New NotesSession Dim db As NotesDatabase Set db = session.CurrentDatabase
' 開一個 NotesStream 當輸出 Dim stream As NotesStream Set stream = session.CreateStream Dim filename As String filename = "C:\dxl\" & Left(db.FileName, Len(db.FileName) - 3) & "xml" If Not stream.Open(filename) Then Messagebox "無法開啟 " & filename, , "錯誤" Exit Sub End If Call stream.Truncate
' 建立 DXL exporter(NotesXMLProcessor 是 abstract,從這裡取衍生類別) Dim exporter As NotesDXLExporter Set exporter = session.CreateDXLExporter
' 設好輸入輸出 Call exporter.SetInput(db) Call exporter.SetOutput(stream)
' 設成「遇 fatal error 就停」、加個 log 註解 exporter.ExitOnFirstFatalError = True exporter.LogComment = "Exported by " & session.UserName
' 真正執行 Call exporter.Process
' 看 log 有沒有 warning / error If Len(exporter.Log) > 0 Then Print "DXL 匯出 log:" Print exporter.Log End If
Call stream.Close Messagebox "DXL 匯出完成。"End Sub幾個值得注意的點:
- NotesXMLProcessor 從不直接 New — 永遠是用
session.CreateXxx拿衍生類別。 - SetInput / SetOutput 後一定要呼叫
Process— 設好不會自己跑。 - Process 是同步的 — 大 DB 匯出時這個 Sub 會 block 到完成為止。
- Log 是 XML 格式 — 想結構化分析錯誤就再用一個 DOMParser parse 它。
順帶的搭配建議
NSF 內 XML 處理常見組合:
- 匯出做備份 / 版本管理:
DXLExporter→ 寫到檔案,配合 git 之類追蹤設計變更 - 匯入 DXL 做部署:
DXLImporter← 從受信任來源匯入,注意 ACL 先確認過 - 解析外部系統 XML:用
DOMParser(< 10 MB)或SAXParser(更大檔) - DXL 轉外部格式:
DXLExporter→ 拿到 DXL →XSLTransformer套 XSLT → 輸出目標格式
結論
NotesXMLProcessor 自己不能用,重要的是它定義了「整個 XML 處理家族」共用的 contract — 一致的 SetInput / SetOutput / Process 三段式 + 一致的 Log 機制。實際寫程式時挑對衍生類別、把 input/output 拼好就能跑。