前回、ノードを検索する GetElementsByTagName メソッドを紹介しました。便利な命令なのですが、配下の階層すべてが検索対象となるため、複雑なコンテンツでは希望するノードが取得できない点に注意が必要となります。その解決策の一例として、引数で指定した名称の最初の子ノードを取得する関数を紹介しました。
今回はその続きで、ノード検索で使いそうな関数を一気に紹介します。
最後の子ノードを取得
前回の関数とほぼ同等ですが、最後から最初のノードに向かって順に走査しています。
Function xGetLastChildByName(vdenParent As NotesDOMElementNode, ByVal vsNodeName As String) As NotesDOMElementNode Dim dn As NotesDOMNode Set dn = vdenParent.LastChild While Not(dn Is Nothing) If dn.IsNull = False Then If dn.NodeType = DOMNODETYPE_ELEMENT_NODE Then If dn.NodeName = vsNodeName Then Set xGetLastChildByName = dn Exit Function End If End If End If Set dn = dn.PreviousSibling If dn.IsNull Then Set dn = Nothing End If Wend End Function |
次のノードを取得
最初が取得できるとその次のノードを取得したくなりますね。最初の表を探してその次の表を取得するという感じです。以下の関数では、引数のノードから兄弟ノードと取得して、走査しています。
Function xGetNextSiblingByName(vdnCur As NotesDOMElementNode, ByVal vsNodeName As String) As NotesDOMNode Dim dn As NotesDOMNode Set dn = vdnCur.NextSibling While Not(dn Is Nothing) If dn.IsNull = False Then If dn.NodeType = DOMNODETYPE_ELEMENT_NODE Then If dn.NodeName = vsNodeName Then Set xGetNextSiblingByName = 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 |
一つ前のノードを取得
続いては、引数のノードより前にあるノードを操作する関数です。PreviousSibling を使って兄弟をさかのぼって走査しています。
Function xGetPrevSiblingByName(vdnCur As NotesDOMElementNode, ByVal vsNodeName As String) As NotesDOMNode Dim dn As NotesDOMNode Set dn = vdnCur.PreviousSibling While Not(dn Is Nothing) If dn.IsNull = False Then If dn.NodeType = DOMNODETYPE_ELEMENT_NODE Then If dn.NodeName = vsNodeName Then Set xGetPrevSiblingByName = dn Exit Function End If End If End If Set dn = dn.PreviousSibling If dn.IsNull Then Set dn = Nothing End If Wend End Function |
子ノード数を取得
続いては、子ノードを操作して、引数で指定した名称の子ノード数を数えて返す関数です。
Function xGetChildCountByName(vdenParent As NotesDOMElementNode, ByVal vsNodeName As String) As Integer Dim dn As NotesDOMNode Dim i As Integer i = 0 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 i = i + 1 End If End If End If Set dn = dn.NextSibling If dn.IsNull Then Set dn = Nothing End If Wend xGetChildCountByName = i End Function |
n 番目の子ノードを取得
子ノード数がわかると位置を指定してノードが取得したくなりますね。次の関数では引数で指定した名称のノードの中から n 番目のノードを返します。
Function xGetNthChildByName(vdenParent As NotesDOMElementNode, ByVal vsNodeName As String, ByVal viNth As Integer) As NotesDOMElementNode Dim dn As NotesDOMNode Dim i As Integer i = 0 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 i = i + 1 If i = viNth Then Set xGetNthChildByName = dn Exit Function End If End If End If End If Set dn = dn.NextSibling If dn.IsNull Then Set dn = Nothing End If Wend End Function |
まとめ
前回、今回とノードの検索方法や普段使いで必要となる関数を紹介ました。これら関数を利用すれば、複雑で広大な DXL の海原を自由自裁、縦横無尽に航海できますね。
前回 | DXL Step-by-Step |
0 件のコメント:
コメントを投稿