2023/08/29

DXL ことはじめ:#8)フィールドの取得

前回は、文書の中身の全体である document ノードと属性の取得を整理しました。属性では、文書 ID や フォーム名など、文書のプロパティ的な要素が取得できました。フォーム名は、フィールド内に保持しているのですが、DXL では特別扱いされているようですね。

今回は、フィールドの取得法についてまとめます。

フィールドは、document ノードの直下にエレメントノードとして存在します。通常のフィールドは、"item" というタグのエレメントノードで、"name" というアットリビュートにフィールド名がセットされています。

それでは、フィールドの取得方法を確認しましょう。

NotesDOMElementNode クラスには、タグ名で配下のエレメントを検索するメソッドがあります。以下のプログラムは、DXL から全フィールド順に取得して、フィールド名を順にメッセージボックスで表示します。

'document ノードの取得
Dim denDoc As NotesDOMElementNode
Set denDoc = ddn.DocumentElement


Dim dnl As NotesDOMNodeList
Dim denFld As NotesDOMElementNode
Dim dan As NotesDOMAttributeNode
Dim i As Integer

Set dnl = denDoc.GetElementsByTagName("item")
For i = 1 To dnl.NumberOfEntries
   Set denFld = dnl.GetItem(i)

   Set dan = denFld.GetAttributeNode("name")
   MsgBox "フィールド名 = " & CStr(dan.NodeValue)
Next

検索は、GetElementsByTagName メソッドで、引数に検索するタグ名を文字で指定します。

戻り値は、NotesDOMNodeList のオブジェクトです。このクラスは、属性の場合の NotesDOMNamedNodeMap と同様に、コレクションのように振舞います。このクラスを使用して、フィールドのエレメントノードを順に取得します。

フィールド名は属性として記録されていますので、"name" を取得して、メッセージボックスに表示しています。


実際のコーディングでは、フィールド名を指定して、ノードを取得するのが一般的かと思います。次のような関数を作っておくと便利かもしれませんね。

document ノード と 取得したいフィールド名を引数にして、見つかったフィールドを NotesDOMElementNode のオブジェクトで返します。

Function xGetField(vdenDoc As NotesDOMElementNode, vsFldName As String) As NotesDOMElementNode
   Dim dnl As NotesDOMNodeList
   Dim denFld As NotesDOMElementNode
   Dim dan As NotesDOMAttributeNode
   Dim i As Integer

   Set xGetField = Nothing
   Set dnl = vdenDoc.GetElementsByTagName("item")
   For i = 1 To dnl.NumberOfEntries
      Set denFld = dnl.GetItem(i)
      Set dan = denFld.GetAttributeNode("name")
      If dan.NodeValue = vsFldName Then
         Set xGetField = denFld
         Exit For
      End If
   Next
End Function


前回 DXL ことはじめ 次回

0 件のコメント:

コメントを投稿