2025/04/28

DXL Step-by-Step:#55)ノード操作 ⑧ - ノードの検索

前回、ノードを検索する 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 件のコメント:

コメントを投稿