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 に表示されています。
XML や DTD については詳しくありませんので、このヘルプを見てもよくわかりませんが、重要なことが一つあります。
DTD は、ノーツのバージョンに応じて違うということです。ノーツは過去のバージョンとできる限り互換性を維持してくれている製品ですので、DTD についても大きく仕様変更されることはないと思われます。ですが、機能の追加やバグの修正などは行われているはずですから、バージョンについては注意してください。
特に開発したバージョンが実行環境より新しい場合は要注意です。
前回 | DXL ことはじめ | 次回 |
0 件のコメント:
コメントを投稿