2023/08/01

DXL ことはじめ:#5)DXL のルートにアクセス

NotesDOMDocumentNode クラスは、XML 文書全体を表し、文書ツリーのルートにあたります。このオブジェクトは、NotesDOMParser クラスの Document プロパティより取得できます。

NotesDOMDocumentNode (LotusScript®)

前回は、DXL の変換を実行するとこまで説明ましたが、それに次のコードを追加すると NotesDOMDocumentNode オブジェクトが取得できます。

 ・・・
'DXL 変換を実行
Call dexp.Process()

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


NotesDOMDocumentNode のプロパティ

このオブジェクトを知るために次のようなコードを書いてみました。上記コードの後続として記述する前提で、ddn には、NotesDOMDocumentNode オブジェクトが代入されているものとしています。

MsgBox xGetMsgText(ddn)

メッセージボックスの中身を作成する関数は次の通りで、各プロパティの名称と値を改行でつないで、返します。

Function xGetMsgText(vo As NotesDOMNode) As String
   Dim s As String
   s = s & "HasChildNodes = " & CStr(vo.HasChildNodes)
   s = s & Chr(10) & "IsNull = " & CStr(vo.IsNull)
   s = s & Chr(10) & "LocalName = " & CStr(vo.LocalName)
   s = s & Chr(10) & "NamespaceURI = " & CStr(vo.NamespaceURI)
   s = s & Chr(10) & "NodeName = " & CStr(vo.NodeName)
   s = s & Chr(10) & "NodeType = " & CStr(vo.NodeType)
   s = s & Chr(10) & "NodeValue = " & CStr(vo.NodeValue)
   s = s & Chr(10) & "NumberOfChildNodes = " & CStr(vo.NumberOfChildNodes)
   xGetMsgText = s
End Function

なお、この関数の呼び出し元で指定したのは NotesDOMDocumentNode のオブジェクトで、関数側では NotesDOMNode で受けています。継承元のクラスで受けるのは LotusScript 上、型の不一致のエラーとはなりません。


さて、実行すると、結果は以下の通りでした。


この結果より、まず、NodeType が 9 であることがわかります。NodeType のヘルプには、このプロパティは以下の値を持つそうです。今回は、9 なので DocumentNode だとわかります。

定数
1 DOMNODETYPE_ELEMENT_NODE
2 DOMNODETYPE_ATTRIBUTE_NODE
3 DOMNODETYPE_TEXT_NODE
4 DOMNODETYPE_CDATASECTION_NODE
5 DOMNODETYPE_ENTITYREFERENCE_NODE
6 DOMNODETYPE_ENTITY_NODE
7 DOMNODETYPE_PROCESSINGINSTRUCTION_NODE
8 DOMNODETYPE_COMMENT_NODE
9 DOMNODETYPE_DOCUMENT_NODE
10 DOMNODETYPE_DOCUMENTTYPE_NODE
11 DOMNODETYPE_DOCUMENTFRAGMENT_NODE
12 DOMNODETYPE_NOTATION_NODE
13 DOMNODETYPE_XMLDECL_NODE

続いて、NumberOfChildNodes が 3 となっています。NotesDOMDocumentNode オブジェクトが3つのノードで構成されているということです。これは、VS Code で表示した DXL をトップレベルで、すべて折りたたむとわかります。

トップレベルのタグが3つだからということですね。


構成要素のノードのアクセス

それでは、その3つのノードにアクセスしましょう。次のようなコードで各ノードを順に取得して確認します。

Dim i As Integer
Dim dn As NotesDOMNode

Set dn = ddn.FirstChild
For i = 1 To ddn.NumberOfChildNodes
   MsgBox xGetMsgText(dn)
   Set dn = dn.NextSibling
Next

最初のノードは、FirstChild プロパティで取得します。2つ目以降は、NextSibling プロパティで取得しています。

NextSibling プロパティは、自分自身のノードの次に続くノードを取得します。NotesDOMDocumentNode はルートなので次はありません。FirstChild プロパティで取得したノードの次とすることで2つ目のノードを取得しています。


実行すると結果は次の通りでした。

それぞれ NodeType が違い、DXL の各ノードが順に取得できていることが確認できます。



DXL の DTD

DXL は XML で構成されています。XML の構造は DTD によって定義されています。DXL では、以下に DTD に表示されています。


DXL の DTD は、Domino Designer Help 内に記述があります。例えば、12.0.2 の場合は次の通りです。

The Domino DTD


XML や DTD については詳しくありませんので、このヘルプを見てもよくわかりませんが、重要なことが一つあります。

DTD は、ノーツのバージョンに応じて違うということです。ノーツは過去のバージョンとできる限り互換性を維持してくれている製品ですので、DTD についても大きく仕様変更されることはないと思われます。ですが、機能の追加やバグの修正などは行われているはずですから、バージョンについては注意してください。

特に開発したバージョンが実行環境より新しい場合は要注意です。

前回 DXL ことはじめ 次回

0 件のコメント:

コメントを投稿