いよいよ、文書の中身を 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 件のコメント:
コメントを投稿