DXL を自由自在に操作するためには NotesDOMNode の役割と使い方を理解することが重要です。
NotesDOMNode クラスとは
まずは、デザイナーヘルプで NotesDOMNode を確認します。
クラスの説明には、
| 文書ツリーの単体のノードを表します。 |
とだけ記載されています。
また、『作成方法とアクセス方法』には、以下の通り記載されています。
|
NotesDOMNode クラスは抽象クラスであるため、NotesDOMNode オブジェクトを作成できません。代わりに、NotesDOMDocumentNode クラスの適切な Create メソッドを使用して、特定の派生ノードクラスのオブジェクトを作成します。 NotesDOMNode クラスとその派生クラスのオブジェクトは、作成元の NotesDOMParser オブジェクトとの関連性を保持します。このメソッドは該当する 2 つのノードが同じ DOM パーサーから派生した場合のみ機能します。 |
これだけでは、さっぱりわかりませんね...。ポイントは、以下の部分です。
派生クラスというセクションがあり、NotesDOMElementNode などのクラスがリストアップされており、最後に「NotesDOMNode クラスから継承」とあります。
簡単に説明すると、NotesDOMElementNode などのクラスは、
- NotesDOMNode を基に定義されたクラスであること
- NotesDOMNode は派生クラスの値を持てること
を表します。
言葉だけではわかりにくいので具体的なコードとともに確認しましょう。
NotesDOMElementNode には、配下のノードを検索するメソッド GetElementsByTagName が存在します。この命令を使用して、"table" ノードを検索し、順に取得する処理を例にします。
|
'表を検索し順に処理 Dim dnl As NotesDOMNodeList Dim dn As NotesDOMNode Dim i As Integer Set dnl = denForm.GetElementsByTagName("table") For i = 1 To dnl.NumberOfEntries Set dn = dnl.GetItem(i) '”表”に対する処理を記述 ・・・ Next |
GetElementsByTagName メソッドの戻り値は NotesDOMNodeList です。このクラスは、検索結果を保持するためのクラスで、複数の NotesDOMNode をコレクションのように保持します。上記サンプルでは、GetItem メソッドで、検索結果から 1 つずつ取得して順に処理させていますが、戻り値の型は NotesDOMNode となっています。実体は ”表” を表すノードですから、NotesDOMElementNode となります。
このように NotesDOMNode クラスは、派生クラスに記載されているオブジェクトを保持できる汎用的なクラスということになります。
NotesDOMNode クラスの使い方
続いては、上記で取得した NotesDOMNode の使い方です。
前述の通り、中身は NotesDOMElementNode クラスのオブジェクトです。ですので、下記の通り NotesDOMElementNode の変数 den に代入できます。代入後の den を利用すれば NotesDOMElementNode クラスのプロパティやメソッドにアクセスできます。
|
'表を検索し順に処理 Dim dnl As NotesDOMNodeList Dim den As NotesDOMElementNode Dim dn As NotesDOMNode Dim i As Integer Set dnl = denForm.GetElementsByTagName("table") For i = 1 To dnl.NumberOfEntries Set dn = dnl.GetItem(i) '”表”に対する処理を記述 Set den = dn 'den を使えば NotesDOMElementNode の機能が使える ・・・ Next |
NotesDOMNode の実態は、NotesDOMElementNode だけでなく、派生クラスとして記述されているさまざまなオブジェクトを取りうることになります。上記例では、"table" ノードを検索したので、実態は NotesDOMElementNode だとわかります。ですが、前回 紹介した FirstChild や NextSibling で取得したノードの場合はどうでしょう。DXL 内で固定の文字列を表す NotesDOMTextNode の可能性もあります。
取得したノードの種類を調べるには、NodeType というプロパティを使用します。戻り値は数値で、多数のノードが定義されています。ただ、一般的な DXL のコーディングでは 1 と 3 を覚えておけば十分でしょう。
| 値 | 定数 | クラス名 |
| 1 | DOMNODETYPE_ELEMENT_NODE | NotesDOMElementNode |
| 3 | DOMNODETYPE_TEXT_NODE | NotesDOMTextNode |
| 9 | DOMNODETYPE_DOCUMENT_NODE | NotesDOMDocumentNode |
9 の NotesDOMDocumentNode については 前々回 で必須クラスとして記載したので掲載していますが、NotesDOMDocumentNode であるかを判断することはないと思います。
NodeType は、具体的には次のように利用します。
FirstChild プロパティで取得したノードを NotesDOMNode の変数でいったん受け取ります。その NodeType を確認したうえで、オブジェクトの型に合致した変数に代入します。
| Dim dn As NotesDOMNode Dim dnChild As NotesDOMNode Dim den As NotesDOMElementNode Dim dtn As NotesDOMTextNode ・・・ Set dnChild = dn.FirstChild If dnChild.NodeType = DOMNODETYPE_TEXT_NODE Then 'テキストノード Set dtn = dnChild ・・・ ElseIf dnChild.NodeType = DOMNODETYPE_ELEMENT_NODE Then 'エレメントノード Set den = dnChild ・・・ End If |
まとめ
今回は NotesDOMNode クラスの使い方についてまとめました。少々ややこしいのですが、ここをしっかり押さえておくと DXL のプログラミングが格段に速くなると思います。
ところで、この記事をここまで読んで、あれっ?? と思うことはなかったですか?
NotesDOMNode の派生クラスの一覧(最初の画像内)に NotesDOMTextNode が含まれていません。ですが、上記サンプルプログラムでは、代入していました。これは、ヘルプやサンプルコードの間違いではありません。
| 'テキストノード Set dtn = dnChild ・・・ |
NotesDOMTextNode のヘルプを見ると継承元が NotesDOMCharacterDataNode となっています。そしてそのクラスの継承元が NotesDOMNode となっています。カスケードした関係だから、記載がなかったということですね。
NotesDOMNode┗ NotesDOMCharacterDataNode┗ NotesDOMTextNode
| 前回 | DXL Step-by-Step | 次回 |

0 件のコメント:
コメントを投稿