2025/04/18

DXL Step-by-Step:#54)ノード操作 ⑦ - ノードの検索

今回は DXL ツリーからノードを検索する方法についてまとめます。


ノードの検索

GetElementsByTagName メソッドを使用するとノードの検索が可能です。

GetElementsByTagName (NotesDOMElementNode - LotusScript®)

このメソッドの使い方はシンプルで、引数に検索したいノード名を指定するだけです。例えば、以下のプログラムでは、リッチテキストを表す richtext ノードを検索しています。

   Dim ddn As NotesDOMDocumentNode
   Dim denDoc As NotesDOMElementNode
   Dim dnl As NotesDOMNodeList
      ・・・
   '文書取得
   Set denDoc = ddn.DocumentElement

   'リッチテキスト検索
   Set dnl = denDoc.GetElementsByTagName("richtext")

戻り値は、名称が一致したすべてのノードを検索された順序で返します。複数のノードの集合となりますので、NotesDOMNodeList のオブジェクトとなります。GetItem メソッドを使用して、必要なノードを取得できます。

   '最初のリッチテキスト取得
   Set denRT = dnl.GetItem(1)

この動作をサンプルの DXL 使って図にすると次のようになります。

図からもわかる通り、GetElementsByTagName メソッドでは、子ノードだけでなく、配下のすべてのノードが検索対象となるという点がポイントとなります。


子ノードだけを検索したい

リッチテキストでは表の中に表を配置するなど、階層化して複雑なコンテンツを表現できます。例えば、リッチテキストにタブ表を作成して、その中に 2 つの表を配置します。

これを DXL 化すると外側の表(赤線の table ノード)の中に内側の表(紫線の table ノード)が作成されます。

このフィールドに対して GetElementsByTagName を利用すると、すべての表がヒットしてしまいます。要は、検索結果では表の階層関係がわからず、希望した位置の表が取得できているのか判別が難しいのです。このような背景から、子ノードだけを検索したいことがしばしばあります。この要件に対応するメソッドはありませんので、自作しなければなりません。

次の関数は、引数で指定した名称の最初の子ノードを取得することができます。

Function xGetFirstChildByName(vdenParent As NotesDOMElementNode, ByVal vsNodeName As String) As NotesDOMElementNode
   Dim dn As NotesDOMNode

   Set dn = vdenParent.FirstChild
   While Not(dn Is Nothing)
      If dn.IsNull = False Then
         If dn.NodeType = DOMNODETYPE_ELEMENT_NODE Then
            If dn.NodeName = vsNodeName Then
               Set xGetFirstChildByName = dn
               Exit Function
            End If
         End If
      End If

      Set dn = dn.NextSibling
      If dn.IsNull Then
         Set dn = Nothing
      End If
   Wend
End Function


まとめと次回の予告

今回は GetElementsByTagName メソッドでノードの検索方法を紹介しました。フィールドを表す item ノードなど階層化されないノードの場合は有効かつ便利に使用できます。しかし、事例に上げたように階層化されるノードでは、関係が不明瞭になり効果的に利用できません。その対策として、指定した名前の最初の子ノードを取得する関数を紹介しました。

最初のノードが取得できれば、次のノードを取得したくなります。最後のノードを取得したり、その一つ手前の取得したいというようなこともあるでしょう。DXL のノードを自由自在に操作するためには必要な機能と言えます。次回は、これらの便利関数を紹介します。


前回 DXL Step-by-Step


0 件のコメント:

コメントを投稿