LotusScriptで設計要素を解析する(その3)

LotusScriptで設計要素のDXLを取得し、解析することで、既存のNotesForm、NotesViewなどのクラスでは確認することができない、詳細なプロパティ設定まで、情報を取得することができます。

DXLとは

DXLとは、Domino XMLのことであり、Dominoの文書や設計要素の情報をXML形式で記述したのもです。その内容は、Domino 文書型定義(Domino DTD)のタグ定義にしたがって記述されています。

設計要素のDXLを確認する

設計要素のDXLは、Domino Designerの標準機能で確認することができます。まず、Domino DesignerからDXLを表示したい設計要素を選択し、上部の「Tools」メニューから「DXLで編集」をクリックします。

「Tools」メニューの「DXLで編集」をクリック

確認のダイアログが表示されるので、「はい」をクリックします。

確認ダイアログで「はい」をクリック

すると、その設計要素のDXLが表示されます。

フォームのDXLの例

※確認ダイアログにも記載されているように、DXLの状態で不用意に内容を変更して保存すると、設計の一部が欠落したり、設計自体が破損する恐れがある為、ご注意ください。

DXLを理解する

DXLには設計要素のほとんどの情報が含まれており、一見複雑に見えますが、タグは設計要素の各要素を意味し、そのタグに含まれる属性は、その要素のプロパティが表現されています。

例えば、以下のようなDXLがあったとします。
<form name='テストフォーム' alias='fmTest'>
    <body>
        <richtext>
            <field type='text' kind='editable' name='Subject'/>
            <field type='richtext' kind='editable' name='Body'/>
        </richtext>
    </body>
</form>

このDXLからは、以下のことが読み取れます。
・<form>タグであることから、設計要素は「フォーム」である
・名称は「テストフォーム」、別名は「fmTest」
・画面上には、以下の2つのフィールドが配置されている
  「Subject」フィールド :編集可能、種類はテキスト
  「Body」フィールド  :編集可能、種類はリッチテキスト

DXLを解析する為には、それぞれのタグや属性が何を意味しているか、また、どのような構造でDXLが出力されるかを知っておくことが重要となります。

「Domino DTD」というキーワードで製品ヘルプを検索すると、タグや属性に関する情報は見つかりますが、タグの構造についてはあまり記載されていません。その為、タグや属性、その構造に対する理解を深める為には、簡単な設計要素を準備し、それがどのようなDXLとなっているかを確認するとよいでしょう。

※Domino DTDは、Notesのバージョンにより仕様が異なる場合があります。Notesは過去バージョンとの互換性が保たれている製品の為、大きな変更はないと思いますが、バージョンアップに伴う新要素の追加やバグ修正などは、Domino DTDに対しても当然行われています。
その結果として、実行するNotesのバージョンによっては、出力されるDXLの内容に若干の差異が発生する場合があることにご注意ください。

LotusScriptでDXLを解析する

LotusScriptには、DXLの解析に有用なクラスがいくつか準備されています。DXLの解析の際は、主に以下のクラスを利用します。

■「NotesDXLExporter」クラス
  ・DXLを生成する
■「NotesDOMParser」クラス
  ・DXLをDOM(文書オブジェクトモデル) ツリー構造で取得する
■各種「NotesDOMxxxxxxNode」クラス
  ・DOMから各ノード(タグの情報など)を取得する

それでは、実際にこれらのクラスを利用して、DXLを解析をしてみます。

'すべてのフォームを取得し、フィールド名を表示する
Dim ns			As New NotesSession
Dim ndb			As NotesDatabase
Dim nc			As NotesNoteCollection
Dim nd			As NotesDocument
Dim nid			As String
Dim i			As Integer

Set ndb = ns.CurrentDatabase
Set nc = ndb.CreateNoteCollection(False)
nc.SelectForms = True			'コレクションにフォームを追加
Call nc.BuildCollection

If (nc.Count = 0) Then
	Exit Sub
End If

nid = nc.GetFirstNoteId
For i = 1 To nc.Count
	Set nd = ndb.GetDocumentByID(nid)		'フォームをNotesDocumentで取得
	Call AnalysisDXL(ns, nd)				'DXLを解析
	
	nid = nc.GetNextNoteId(nid)
Next
'<form>タグに含まれるすべての<field>タグを取得し、フィールド名を表示する
Sub AnalysisDXL(ns As NotesSession, nd As NotesDocument)
	Dim dxlExp			As NotesDXLExporter
	Dim domParser		As NotesDOMParser
	Dim docNode			As NotesDOMDocumentNode
	Dim form			As NotesDOMElementNode
	Dim fields			As NotesDOMNodeList
	Dim field			As NotesDOMElementNode
	Dim i				As Integer
	Dim outText			As String
	
	Set dxlExp = ns.CreateDXLExporter
	Set domParser = ns.CreateDOMParser()

	Call dxlExp.SetInput(nd)
	Call domParser.SetInput(dxlExp)
	Call dxlExp.Process						'DXLを生成し、domParserでDOMが利用可能になる

	Set docNode = domParser.Document
	Set form = docNode.DocumentElement		'ルートノード(今回は <form>タグ)を取得
	Set fields = form.GetElementsByTagName("field")
	For i = 1 To fields.NumberOfEntries
		Set field = fields.GetItem(i)
		outText = outText + field.GetAttribute("name") + Chr(13) + Chr(10)
	Next
	MsgBox outText, 64, form.GetAttribute("name")
End Sub
出力結果

処理の流れとしては、①NotesNodeCollectionクラスを利用して、設計要素をNotesDocumentとして取得し、②その文書をNotesDXLExporterクラスを利用して、DXLを生成します。
そして、③そのDXLをNotesDOMParserクラスにより、DOMで扱える状態に変換した後、④DOMを操作して各タグやその属性の情報を取得します。

この④の際に、目的のタグや属性の名称などの情報が必要となる為、前述のDXLの理解が必要となります。

この記事が気に入ったらサポートをしてみませんか?