2023/08/22

DXL ことはじめ:#7)文書の中身にアクセス

いよいよ、文書の中身を LotusScript でアクセスします。まずは、文書全体を表す document ノードのオブジェクトを取得します。


document ノードのアクセス

このノードを取得するには専用のプロパティがあるので簡単です。

NotesDOMDocumentNode クラスの DocumentElement プロパティで取得でき、NotesDOMElementNode のオブジェクトを返します。

前回までのコードに以下を追加すると document ノードのオブジェクトが取得できます。

 ・・・
'DOM ツリーのルートを取得
Dim ddn As NotesDOMDocumentNode
Set ddn = dprs.Document


Dim den As NotesDOMElementNode
Set den = ddn.DocumentElement


今回の DXL であれば次のコードでも取得可能です。

Set den = ddn.LastChild

ただ、DXL の構造上 "document" というノードが必ず”最後”なのかは定かではありません。ですので、DocumentElement プロパティを使うほうが良いと思います。


これで document ノードが NotesDOMElementNode のオブジェクトとして取得できました。これまで利用してきた DXL を使って、このオブジェクトのメソッドやプロパティの使い方を整理しましょう。


属性の取得

まずは、属性(”アットリビュート”と書くと長いのでこう表現します)名がわかっていて、その値を取得する方法です。

NotesDOMElementNode クラスの GetAttributeNode メソッドを使用します。構文は単純で、引数に属性名を指定するだけです。

例えば、次のような感じです。

'document ノードの取得
Dim den As NotesDOMElementNode
Set den = ddn.DocumentElement

Dim dan As NotesDOMAttributeNode
Set dan = den.GetAttributeNode("form")


MsgBox xGetMsgText(dan)

属性に対しても専用ノードのクラス NotesDOMAttributeNode が存在します。そのオブジェクトを取得してプロパティをメッセージボックスで表示しています。

実行すると次のような結果となります。

NodeName に属性名、NodeValue にその値 "zip" がセットされています。


続いて、すべての属性を取得して順に処理する方法です。まず、すべての属性は、Attributes プロパティで取得できます。型は専用のクラス NotesDOMNamedNodeMap となっています。このクラスは、NotesDocumentCollection のような振る舞いをし、オブジェクト内のノード数を取得するプロパティと単一のノードを番号で指定して取得するメソッドがあります。

サンプルは次の通りです。

'document ノードの取得
Dim den As NotesDOMElementNode
Set den = ddn.DocumentElement

Dim dnmap As NotesDOMNamedNodeMap
Dim dan As NotesDOMAttributeNode
Dim i As Integer

Set dnmap = den.Attributes
For i = 1 To dnmap.NumberOfEntries
   Set dan = dnmap.GetItem(i)

   MsgBox xGetMsgText(dan)
Next

GetItem メソッドの戻り値は、NotesDOMNode です。しかし、今回は、属性であることがわかっていますので、NotesDOMAttributeNode のオブジェクト変数に直接代入しています。NotesDOMAttributeNode クラスは、NotesDOMNode を継承しているので型の不一致エラーは発生しません。#5 でも触れた、NotesDOMDocumentNode と NotesDOMNode の関係と同じですね。

実行した結果は以下の通りでした。合計7つの属性が取得できました。

NodeName NodeValue
form zip
xmlns http://www.lotus.com/dxl
version 12.0
confrict false
responce false
replicaid 492589DF0006FF90
maintenanceversion 2.1

DXL に含まれない confrict と responce が出力されました。

DXL 化した文書は、返答文書でなく、競合文書でもありません。値が False なので正しいです。しかし、NotesDXLExporter が出力した DXL(文字列)を NotesDOMParser で解析している”だけ”だとこの結果には納得できません。内部的には、もっと複雑なことをしているのでしょう。

必ずしも DXL 文字列の通りでないこともあるということですね...

前回 DXL ことはじめ 次回

0 件のコメント:

コメントを投稿