none
PowerShellを使い、「SharePoint Online」 のリストを、『XML形式』でダウンロード(保存)する方法が分かりません。 RRS feed

  • 質問


  • 前提・実現したい事
    ---
    SharePoint Online上にあるリストを、"XML形式"でダウンロード(保存)したいと考えております。



    発生している問題・Error Message
    ---
    ネットで調べてみましたが、自分の検索(探し方)が悪かったのか
    「SharePoint から XML でダウンロードする方法」の記事が無かったです。(見つからなかった)

    ①開発経験も浅い為、PowerShellでどの様にコードを書けば良いのか分かりません。
    ②ネットにXML形式で保存方法が無かったので、「そもそも、SharePoint から XML形式で保存」が出来ない?

    上記、2点が困っている所です。
    もし分かる方がいれば、サンプルでも良いのでコードをご教示頂ければと思います。
    よろしくお願い致します。。


    実際のソースコード
    ---
    ・無し


    試した事
    ---
    ・ネットで検索

    ↓検索ワード↓
    「SharePoint XML ダウンロード」、「PowerShell XML ダウンロード」、「PowerShell XML 保存」、「SharePoint XML 保存」
    「SharePoint PowerShell XML」・・・等



    補足情報(言語/FW/ツール等のVersion)
    ---
    ・Windows 7
    ・IE、Google Chrome
    ・PowerShell Version 5.0
    ・SharePoint Online(Office365)
    • 編集済み mie.8 2017年6月20日 7:09
    2017年6月19日 2:15

回答

  • こんにちは。

    XMLのフォーマットについての言及がなかったので、とりあえずでサンプルを作ってみました。
    PowerShellでは、XMLを書く簡単な方法はなさそうなので、XmlDocumentを使うのがよさそうです。

    $siteUrl = "https://example.sharepoint.com"
    $userName = "user@example.microsoftonline.com"
    $password = "p@ssw0rd" | ConvertTo-SecureString -Force -AsPlainText
    $listTitle = "List1"
    
    $clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
    $clientContext.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($userName, $password)
    
    $list = $clientContext.Web.Lists.GetByTitle($listTitle)
    $clientContext.Load($list)
    $clientContext.ExecuteQuery()
    
    $query = New-Object Microsoft.SharePoint.Client.CamlQuery
    $query.ViewXml = "<View><Query><OrderBy><FieldRef Name='ID'/></OrderBy></Query></View>"
    $items = $list.GetItems($query)
    $clientContext.Load($items)
    $clientContext.ExecuteQuery()
    
    $xmlDocument = New-Object System.Xml.XmlDocument
    $listElement = $xmlDocument.AppendChild($XmlDocument.CreateElement("List"))
    foreach ($item in $items) {
        $itemElement = $listElement.AppendChild($XmlDocument.CreateElement("Item"))
        foreach ($value in $item.FieldValues.GetEnumerator()) {
            $valueElement = $itemElement.AppendChild($XmlDocument.CreateElement($value.Key))
            $valueElement.InnerText = $value.Value
        }
    }
    Write-Host $xmlDocument.OuterXml

    (追記)
    「リストを保存」というのがあいまいだったので、リストアイテムのデータの保存と解釈しました。
    リストの設定を保存とかの意味でしたらごめんなさい。


    2017年6月19日 2:50
  • リストアイテムの検索にはCAMLを使っています。データベースにおけるSQLのようなものです。

    CAML (Collaborative Application Markup Language) の概要
    https://msdn.microsoft.com/ja-jp/library/ms426449.aspx

    先のサンプルでは何を指定していいかわからなかったのでIDでソートするようにしています。ここは要件によると思いますので、ご自身で決められるのがよいと思います。ちなみにID=48のデータを取得したい場合

    <View><Query><Where><Eq><FieldRef Name='ID'/><Value Type='Number'>48</Value></Eq></Where></Query></View>

    のようになります。

    CreateElementについてはXMLの生成に関するメソッドです。

    XmlDocument.CreateElement メソッド
    https://msdn.microsoft.com/ja-jp/library/system.xml.xmldocument.createelement.aspx

    どのようなフォーマットのXMLがほしいのかがわからかったので、仮に以下のような感じのXMLを作成するイメージでした。

    <List>
      <Item>
        <ID>48<ID>
        <Title>タイトル1</Title>
        ...
      </Item>
      ...
    </List>
    

    2017年6月19日 4:35

すべての返信

  • こんにちは。

    XMLのフォーマットについての言及がなかったので、とりあえずでサンプルを作ってみました。
    PowerShellでは、XMLを書く簡単な方法はなさそうなので、XmlDocumentを使うのがよさそうです。

    $siteUrl = "https://example.sharepoint.com"
    $userName = "user@example.microsoftonline.com"
    $password = "p@ssw0rd" | ConvertTo-SecureString -Force -AsPlainText
    $listTitle = "List1"
    
    $clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
    $clientContext.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($userName, $password)
    
    $list = $clientContext.Web.Lists.GetByTitle($listTitle)
    $clientContext.Load($list)
    $clientContext.ExecuteQuery()
    
    $query = New-Object Microsoft.SharePoint.Client.CamlQuery
    $query.ViewXml = "<View><Query><OrderBy><FieldRef Name='ID'/></OrderBy></Query></View>"
    $items = $list.GetItems($query)
    $clientContext.Load($items)
    $clientContext.ExecuteQuery()
    
    $xmlDocument = New-Object System.Xml.XmlDocument
    $listElement = $xmlDocument.AppendChild($XmlDocument.CreateElement("List"))
    foreach ($item in $items) {
        $itemElement = $listElement.AppendChild($XmlDocument.CreateElement("Item"))
        foreach ($value in $item.FieldValues.GetEnumerator()) {
            $valueElement = $itemElement.AppendChild($XmlDocument.CreateElement($value.Key))
            $valueElement.InnerText = $value.Value
        }
    }
    Write-Host $xmlDocument.OuterXml

    (追記)
    「リストを保存」というのがあいまいだったので、リストアイテムのデータの保存と解釈しました。
    リストの設定を保存とかの意味でしたらごめんなさい。


    2017年6月19日 2:50
  • ご回答、サンプルプログラムありがとうございます。

    早速試してみたいと思います。

    自分の説明がわかりづらく、申し訳ございませんでした。

    SharePoint上に、カスタムリストで「Test」という名前でリストを作成したとします。

    「Test」という名前のリスト全部、Test内にあるアイテムも含め全て取得したいと思っておりました。

    2017年6月19日 3:34
  • すみません。

    ご質問なのですが、

    $query.ViewXml = "<View><Query><OrderBy><FieldRef Name = 'ID'/></OrderBy></Query></View>"

    の「ID」部分は、アイテムのIDを指定すればよろしいでしょうか?

    【例】

    $query.ViewXml = "<View><Query><OrderBy><FieldRef Name = '48'/></OrderBy></Query></View>"

    また、

    $listElement = $xmlDocument.AppendChild($XmlDocument.CreateElement("List"))
    $itemElement = $listElement.AppendChild($XmlDocument.CreateElement("Item"))

    の部分は、"List" と "Item" を何を指定すればよろしいでしょうか?

    関数:CreateElement を調べましたが、「概要:指定の要素名の要素を生成します。」

    と書いてあり分からず・・・



    • 編集済み mie.8 2017年6月19日 6:29 .
    2017年6月19日 4:14
  • リストアイテムの検索にはCAMLを使っています。データベースにおけるSQLのようなものです。

    CAML (Collaborative Application Markup Language) の概要
    https://msdn.microsoft.com/ja-jp/library/ms426449.aspx

    先のサンプルでは何を指定していいかわからなかったのでIDでソートするようにしています。ここは要件によると思いますので、ご自身で決められるのがよいと思います。ちなみにID=48のデータを取得したい場合

    <View><Query><Where><Eq><FieldRef Name='ID'/><Value Type='Number'>48</Value></Eq></Where></Query></View>

    のようになります。

    CreateElementについてはXMLの生成に関するメソッドです。

    XmlDocument.CreateElement メソッド
    https://msdn.microsoft.com/ja-jp/library/system.xml.xmldocument.createelement.aspx

    どのようなフォーマットのXMLがほしいのかがわからかったので、仮に以下のような感じのXMLを作成するイメージでした。

    <List>
      <Item>
        <ID>48<ID>
        <Title>タイトル1</Title>
        ...
      </Item>
      ...
    </List>
    

    2017年6月19日 4:35
  • アイテムの、「XML取得」が出来ました!

    ありがとうございます。

    色々と教えて頂き、ありがとうございます。

    まだまだ開発経験が浅く、ネットで関数等を調べても解説を読んでも、分からない用語ばかりで進まず・・・

    また、コードの書き方・記述方法も良く分からなかったので非常に助かりました。

    頂いたコードの関数・処理を調べ、理解を深めたいと思います。

    ----

    本来のやりたい事としては、

    SharePoint上のリストをXML形式でローカルにダウンロード(保存)

    保存したXMLを使い、別サーバのSharePoint 上にリストを作成

    を行いたいです。

    XML についても、調べてみましたが、「拡張可能なマーク付け言語」としか覚えきれず・・・

    どのようなフォーマットのXMLがほしいのかがわからかったので、仮に以下のような感じのXMLを作成するイメージでした。

    との事でしたが、XMLは、いくつかフォーマットがあるのでしょうか?

    他サイトを見ると、書き出しが【<?xml version="1.0" encoding="Shift_JIS" ?>

    となっていたりするのですが、上記の様に、XMLを使いSharePoint上にリスト登録をする書き出しはご存知でしょうか?

    よろしくお願い致します。

    2017年6月19日 5:02
  • 調べて、取得したXMLをファイル形式(○○.xml) で、ローカルに保存は出来ました。
    2017年6月19日 5:12