SharePoint の Copy Web サービスの GetItem メソッドを利用したデータ取得方法
前回は SharePoint の Web サービスである Lists Web サービスの ListGetItems メソッドを利用して、特定のライブラリやリスト内のアイテム一覧を呼び出す方法をご紹介いたしました。
今回は前回使用したサンプルと組み合わせて、選択したアイテムのデータを取得する方法についてご紹介したいと思います。
選択したアイテムを取得する方法ですが、同じく SharePoint の Web サービスである Copy Web サービスの GetItem メソッドを利用してデータを取得します。
Copy Web サービスの GetItem メソッドの詳細はこちらです。
Copy.GetItem Method (Copy)
https://msdn.microsoft.com/en-us/library/copy.copy.getitem.aspx
このメソッドの難点ですが、1個のアイテムしかコピーできません。
なので、リスト上の特定のアイテムを選択して、コピーするには Lists Web サービスの ListGetItems メソッドと併用する必要があります。
呼び込む XML データですが、前回少し紹介した InfoPath の XML データを利用します。
データ構造は以下のような感じです。
詳細は添付の XML ファイルを参考にしてください。
また、利用するソリューションは前回のサンプルを利用してください。
手順:
1. Copy Web サービスを Web 参照に追加します。
1.1 データソース構成ウィザードから、[Web サービス] を選択します。
※前回、Web 参照を追加したソリューションですので、[Web サービス] が選択項目として、選べるはずです。
通常はサービスから Web 参照を選択するような形になります。
1.2 [Web 参照の追加] で Copy Web サービスの URL を入力し、[参照の追加]をクリックします。
※ Copy Web サービスのリンクは 次のような URL です。https://<サーバー名>/_vti_bin/copy.asmx
1.3 ソリューションエクスプローラーで Web 参照が追加されたことが確認できます。
※Web 参照の名前は既定で自動生成ですので、任意の名前に変更します。
2. リストボックスがクリックされたイベントを生成します。
※作業ウィンドウのリストボックスコントロールには、前回、ご紹介した以下のような XML データの一覧が表示されています。
このデータをクリックした際に Copy Web サービスの GetItem メソッドを呼び出し、実際の XML データを取り込みます。
2.1 ListBox1 コントロールの Click イベントを呼び出します。
2.2 Click イベント内に以下のコードを貼り付けます。
※必要に応じて、内容を修正します。
コードの説明は後のほうで解説します。
Dim orderXML As String = Me.ListBox1.SelectedItem
rows = dset.Tables(0).Select("File1 ='" & orderXML.Replace("'", "''") & "'")
Dim fileName2 As String
fileName2 = rows(0).Item("File2").ToString
Dim myCopyService As New <Copy Web サービスの参照名>.Copy()
myCopyService.Credentials = System.Net.CredentialCache.DefaultCredentials
myCopyService.Url = "https://<サーバー名>/_vti_bin/copy.asmx"
Dim copySource As String = "https://<サーバー名>/<サイト名>/<ライブラリ名>/" & fileName2 & ".xml"
Dim url As String = copySource
Dim myFieldInfo As New <Copy Web サービスの参照名>.FieldInformation
Dim myFieldInfoArray As <Copy Web サービスの参照名>.FieldInformation() = {myFieldInfo}
Dim myByte As Byte
Dim myByteArray() As Byte = {myByte}
myCopyService.GetItem(url, myFieldInfoArray, myByteArray)
Dim mem As MemoryStream = New MemoryStream(myByteArray)
Dim xmlData As New XmlDocument
Dim nameSpaceURI As String = "https://schemas.microsoft.com/office/infopath/2003/myXSD/2006-10-12T08:36:35"
Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlData.NameTable)
nsmgr.AddNamespace("my", nameSpaceURI)
xmlData.Load(mem)
2.3 デバッグし動作を確認します。
このように、選択したアイテムの XML データをメッセージボックスに表示することができました。
実際には以下の図のように取得した XML データをシート上のセルやコントロールに表示させることが一般的だと思います。
今回ご紹介させていただいたコードを元に以下のようなものを実際に作成することは可能です。
続いて、コードの解説をおこないたいと思います。
コードの解説:
このまま、コピーアンドペーストしても使えるように、コメントを含めて記載しています。
'コードここから
'リストボックスで選択したアイテムを変数に設定します。
Dim orderXML As String = Me.ListBox1.SelectedItem
'変数 orderXML のテキストを元に配列の中からフィルタをかけて、値をrows に格納します。
rows = dset.Tables(0).Select("File1 ='" & orderXML.Replace("'", "''") & "'")
Dim fileName2 As String
'rows に格納した値の行の2列目の値を fileName2 に格納します。
fileName2 = rows(0).Item("File2").ToString
'Copy Web サービスを宣言します。
Dim myCopyService As New <Copy Web サービスの参照名>.Copy()
'認証方法を設定します。
myCopyService.Credentials = System.Net.CredentialCache.DefaultCredentials
'Copy Web サービスの URL を設定します。
myCopyService.Url = "https://<サーバー名>/_vti_bin/copy.asmx"
'Copy する元の URL と ファイル名を設定します。
Dim copySource As String = "https://<サーバー名>/<サイト名>/<ライブラリ名>/" & fileName2 & ".xml"
Dim url As String = copySource
Dim myFieldInfo As New <Copy Web サービスの参照名>.FieldInformation
Dim myFieldInfoArray As <Copy Web サービスの参照名>.FieldInformation() = {myFieldInfo}
'コピーしたデータをメモリに格納するための準備をおこないます。
Dim myByte As Byte
Dim myByteArray() As Byte = {myByte}
'Copy Web サービスの GetItem メソッドを呼び出し、データの取得元と取得先を引数として設定します。
myCopyService.GetItem(url, myFieldInfoArray, myByteArray)
'取得したデータをメモリに格納します。
Dim mem As MemoryStream = New MemoryStream(myByteArray)
'XML データを呼び込むための宣言です。
Dim xmlData As New XmlDocument
'InfoPath のスキーマを呼び込むための宣言です。
Dim nameSpaceURI As String = "https://schemas.microsoft.com/office/infopath/2003/myXSD/2006-10-12T08:36:35"
Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(xmlData.NameTable)
nsmgr.AddNamespace("my", nameSpaceURI)
'XML のデータをメモリに格納します。
xmlData.Load(mem)
'XML データ内の取得する要素について、宣言しておきます。
Dim shopName As XmlNodeList = xmlData.SelectNodes("/my:見積書/my:基本情報/my:顧客名", nsmgr)
Dim salesPersonName As XmlNodeList = xmlData.SelectNodes("/my:見積書/my:基本情報/my:担当営業名", nsmgr)
Dim orderDate As XmlNodeList = xmlData.SelectNodes("/my:見積書/my:見積内容/my:見積日付", nsmgr)
'宣言したものについて、メッセージボックスで表示します。
MessageBox.Show(orderDate(0).InnerXml.ToString)
MessageBox.Show(shopName(0).InnerText.ToString)
MessageBox.Show(salesPersonName(0).InnerXml.ToString)
'コードここまで
以上、必要に応じて、コードを修正しご利用いただければと思います。