SharePoint の Lists Web サービスを利用したライブラリ一覧の取得
先日、開発歴30年という、開発の大先輩から励ましのメールをいただきました。
この場を借りて、御礼申し上げます。
ありがとうございました。
また、VSTO を取り巻く状況について、以下のご指摘をいただきました。
- VSTO に関しての資料や情報が極端に少ない
- Office 2003 では配置に手間がかかる(Office 2003 ベース)
- Office 2003 を利用しているユーザーが圧倒的に多いので、開発者としては、Office 2003 の情報が欲しい。
- VBA から移行するための情報が欲しい。
ご意見をいただきまして、確かにそうだなと思いました。
VSTO に関しては本当に情報が非常に少なく、また、Office 2003 では、VS2008 になっても配置、更新は手間がかかります。
また、MS が出している情報は Office 2007 をターゲットにしているものが多いです。
今後はこのあたりを考慮して、情報を提供させていただきたいと思います。
さて、今回は SharePoint 上のライブラリから一覧の取得について、ご紹介したいと思います。
今回のネタは基本、Office 2003 でも可能ですが、デモ環境の関係上、Office 2007 でご紹介させていただきます。
ちなみに読み込むデータは InfoPath で生成した XML データになりますが、読み込んだデータの取り扱いについては、また、別の回でご紹介する予定です。
以下が SharePoint のライブラリです。データは InfoPath になります。
以下は InfoPath のフォームです。
データ自体は XML ですが、テンプレートを参照して、以下のようなフォームとして開きます。
この XML データの一覧を作業ウィンドウのリストボックスコントロールに表示する方法についてご紹介します。
まず、SharePoint のドキュメントライブラリやリストの一覧をとりこむには SharePoint が持っている Web サービスを利用します。
SharePoint の Web サービスの利用は単純で以下のような URL を Web 参照やサービス参照として、設定します。
SharePoint 上の Web サービスの呼び出しは https://<サーバー名>/_vti_bin/<webサービス名>.asmx です。
ここでは、Lists Web サービスを設定し、GetlistItems メソッドを呼び出します。
手順:
1. 以下のように作業ウィンドウを作成し、リストボックスコントロールを配置します。
1.1 スタートアップ時に作業ウィンドウが起動するように ThisWorkbook.vb にコードを記載します。
作業ウィンドウの作成についての詳細は以下のブログをご確認ください。
カスタム作業ウィンドウの追加について(ドキュメントレベル編)
2.最初にサービス参照を設定します。
2.1 [新しいデータソースの追加]-[データソースの種類を選択]で [サービス] を選択し、[サービス参照の追加]で[詳細設定] をクリックします。
2.2 続いて、[Web 参照の追加] を選択します。
2.3 URL に Lists Web サービスの URL を入力し、任意の [Web 参照名] を記載します。その後、[参照の追加] をクリックします。
2.4 完了画面がでますので、[完了]をクリックします。
3. 次に特定のライブラリのデータ一覧を読み込むコードを記述します。
3.1 最初に以下をインポートします。
Web 参照した List Web サービスと XML データの呼び込みのための System.XML クラスをインポートします。
Imports MOSSWebService.<Web 参照名>
Imports System.Xml
3.2 UserControl1 の Load イベントを読み込み、下記のコードを記述します。
Private Sub UserControl1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'リストサービスの認証方式と URL を指定します。
Dim listService As New Lists()
listService.Credentials = System.Net.CredentialCache.DefaultCredentials
listService.Url = https://<サーバー名>/_vti_bin/Lists.asmx
End Sub
3.3 次に UserControl1 クラスで利用できるデータセットとテーブルを作成します。
' UserControl1 で利用できるデータセットとテーブル(FileInfo)を作成します。
'データセットを宣言します。
Dim dset As New DataSet
'データセット上にテーブル(FileInfo)を作成します。
Dim tbl As DataTable = dset.Tables("FileInfo")
Dim drow As DataRow
Dim rows() As DataRow
※このデータセットにライブラリの一覧を読み込みます。
3.4 Lists Web サービスから情報を取得するのに必要な情報を記載します。
※ここは環境によって異なりますので、CodePlex の SharePoint Manager などを利用して、情報を取得してください。
以下は SharePoint Manager から見たライブラリの GUID です。
ここで、ライブラリの既定のビュー名も確認できます。(結構、便利なツールです。MOSS 開発には必須と言えると思います。)
'取得するライブラリの GUID
Dim listName As String = "{f0d03aa8-b128-4d61-af71-5f0e7534de7a}"
'取得するライブラリのビュー名
Dim viewName As String = "{aacdffd3-645b-41c5-abe6-44b090de82e6}"
'取得するデータの行数です。
Dim rowLimit As String = "150"
3.5 次に List Web サービスを通して、List のメタデータを含む XML を取得します。以下は取得した XML データに対してのクエリを実行するための XML 要素です。
Dim xmlDoc As New XmlDocument()
Dim query As System.Xml.XmlElement = xmlDoc.CreateElement("Query")
Dim viewFields As System.Xml.XmlElement = xmlDoc.CreateElement("ViewFields")
Dim queryOptions As System.Xml.XmlElement = xmlDoc.CreateElement("QueryOptions")
'ファイル名(""_x30d5__x30a1__x30a4__x30eb__x540d_"")を軸として、XML データを取得するフィルタ
viewFields.InnerXml =
"<FieldRefName=""_x30d5__x30a1__x30a4__x30eb__x540d_"" />"
queryOptions.InnerXml = ""
'GetListItems の引数を元にフィルタをかけ、Lists Web サービスからデータを取得します。
Dim nodeListItems As XmlNode = listService.GetListItems
(listName, viewName, query, viewFields, rowLimit, queryOptions, Nothing)
'取得したデータを XmlDataDocument クラスの xmlDocResult 変数に InnerXml として格納します。
Dim xmlDocResult As XmlDataDocument = New XmlDataDocument
xmlDocResult.LoadXml(nodeListItems.InnerXml)
'取得した生データの "z:row" タグを元に XmlNodeList の行に追加します。
Dim rows As XmlNodeList = xmlDocResult.GetElementsByTagName("z:row")
ここで取得する情報は Lists Web サービスの生の XML データですので、CAML を利用したクエリをおこなうなど、情報の加工が必要になります。
ファイル名 (""_x30d5__x30a1__x30a4__x30eb__x540d_"")の ID については、前述の SharePoint Manager で "Internal Name" の表記で確認可能です。
以下が Lists Web サービスから取得した生データとなります。
この生データは Excel シートに Text ボックスを配置して、その中に取得したものを流し込んでいます。
ちなみに構文は以下です。
Globals.Sheet1.TextBox1.Text = xmlDocResult.InnerXml
これで Lists Web サービスから取得したデータがどのようなものか確認できるかと思います。
4. 最後に Lists Web サービスから読み込んだ XML データを整形します。
4.1 "Z:row" のタグにはファイル一覧の個々のファイル情報が含まれていますので、このファイル情報を XmlNodeList に代入します。
また、このリスト内の1要素を XmlNode クラスとして宣言します。
'"z:row" のタグ内には一覧内のファイル情報が含まれていますので、それを XmlNodeList に代入します。
Dim rows As XmlNodeList = xmlDocResult.GetElementsByTagName("z:row")
'XmlNode として、XmlNodeList 内の1要素として宣言します。
Dim attribute As XmlNode
4.2 メモリ上のテーブルの追加と列の追加をおこないます。
'メモリ上のテーブル(FileInfo)の追加
dset.Tables.Add("FileInfo")
'メモリ上の列1(File1)の追加
dset.Tables(0).Columns.Add("File1")
'メモリ上の列2(File2)の追加
dset.Tables(0).Columns.Add("File2")
4.3 XmlNodelist 内のデータの処理を最後の行になるまでおこないます。
For Each attribute In rows
Dim str As String
Dim str2 As String
'ファイル名の列の値を取得し、変数 "str" に代入します。
'例)ows__x30d5__x30a1__x30a4__x30eb__x540d_ = "2008-04-09_PCストア秋葉原_山田"
str = attribute.Attributes("ows__x30d5__x30a1__x30a4__x30eb__x540d_").Value
'ファイル名を取得し、変数 "str2" に代入します。
'例)ows_FileLeafRef="18;#2008-04-09_PCストア秋葉原.xml"
str2 = attribute.Attributes("ows_FileLeafRef").Value
'str2 の文字列を加工し、str3 に代入します。
Dim shr As Integer = str2.IndexOf("#")
Dim str3 As String = str2.Remove(0, shr + 1).Replace(".xml", "")
'メモリのテーブル上に新しい行を追加します。
drow = dset.Tables(0).NewRow
'列1に str、列2 に str3 を代入します。
drow.Item(0) = str
drow.Item(1) = str3
dset.Tables(0).Rows.Add(drow)
'リストボックスに列1の値であるファイル名を追加します。
Me.ListBox1.Items.Add(str.ToString)
Next
※ここで2列に情報を含めている理由ですが、1列目は表示名で2列目はファイル名になります。
1列目の表示名をクリックした際にファイル名の XML のデータを取得するような動作を想定して、2列にしています。
以下が完成の画面です。
シート内のテキストボックスは参考のために List Web サービスから取得した情報を表示しています。
本題の SharePoint のライブラリの情報は右側の作業ウィンドウのリストボックスに表示されています。
今回、ご紹介した内容のサンプルを添付しておきましたので、必要に応じて、修正いただき動作をご確認いただければと思います。
以下は今回ご紹介した Lists Web サービスの GetListItems メソッドの情報リソースです。
リスト アイテムを返す
https://msdn.microsoft.com/ja-jp/library/ms429658.aspx
Lists.GetListItems Method (Lists)
https://msdn.microsoft.com/en-us/library/lists.lists.getlistitems.aspx
次回はリストボックスのアイテムを選択した際に XML データを呼び込む方法について、ご紹介したいと思います。