2025/03/11

DXL Step-by-Step:#50)ノード操作 ③ - NotesDOMNode の使い方

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 だとわかります。ですが、前回 紹介した FirstChildNextSibling で取得したノードの場合はどうでしょう。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 件のコメント:

コメントを投稿