今回は 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 |