2009-05-05 8 views

答えて

3

私は、これを達成するためにSharePoint Webサービスと連携してC#プログラムを使用しました。また、Eric Whiteのブログhereの拡張メソッド(GetXElement、GetXmlNode)を使用して、XMLNodeとXElementsの間で変換を行い、SharePointのXMLをより使いやすくしました。以下は

は1 SharePointのリスト(2003または2007のいずれか)から別のものに、添付ファイルを含め、リストデータを転送するために必要なコードのほとんどのテンプレートです:

1)このコードは後に添付ファイルを移動させています新しい項目がターゲットリストに追加されました。古いSharePointのリストを反復処理して、新しいものを移入することを

// Adds attachments from a list item in one SharePoint server to a list item in another SharePoint server. 
// addResults is the return value from a lists.UpdateListItems call. 
private void AddAttachments(XElement addResults, XElement listItem) 
{ 
    XElement itemElements = _listsService2003.GetAttachmentCollection(_listNameGuid, GetListItemIDString(listItem)).GetXElement(); 

    XNamespace s = "http://schemas.microsoft.com/sharepoint/soap/"; 

    var items = from i in itemElements.Elements(s + "Attachment") 
       select new { File = i.Value }; 

    WebClient Client = new WebClient(); 
    Client.Credentials = new NetworkCredential("user", "password", "domain"); 

    // Pull each attachment file from old site list and upload it to the new site list. 
    foreach (var item in items) 
    { 

     byte[] data = Client.DownloadData(item.File); 
     string fileName = Path.GetFileName(item.File); 
     string id = GetID(addResults); 
     _listsService2007.AddAttachment(_newListNameGuid, id, fileName, data); 
    } 
} 

2)コード。

private void TransferListItems() 
    { 

     XElement listItems = _listsService2003.GetListItems(_listNameGuid, _viewNameGuid, null, null, "", null).GetXElement(); 

     XNamespace z = "#RowsetSchema"; 
     foreach (XElement listItem in listItems.Descendants(z + "row")) 
     { 
      AddNewListItem(listItem); 
     } 
    } 

    private void AddNewListItem(XElement listItem) 
    { 
     // SharePoint XML for adding new list item. 
     XElement newItem = new XElement("Batch", 
      new XAttribute("OnError", "Return"), 
      new XAttribute("ListVersion", "1"), 
      new XElement("Method", 
       new XAttribute("ID", "1"), 
       new XAttribute("Cmd", "New"))); 

     // Populate fields from old list to new list mapping different field names as necessary. 
     PopulateFields(newItem, listItem); 

     XElement addResults = _listsService2007.UpdateListItems(_newListNameGuid, newItem.GetXmlNode()).GetXElement(); 

     // Address attachements. 
     if (HasAttachments(listItem)) 
     { 
      AddAttachments(addResults, listItem); 
     } 
    } 

    private static bool HasAttachments(XElement listItem) 
    { 
     XAttribute attachments = listItem.Attribute("ows_Attachments"); 

     if (System.Convert.ToInt32(attachments.Value) != 0) 
      return true; 

     return false; 
    } 

3)このサンプルのその他のサポートコード。

using System.Collections.Generic; 
    using System.Linq; 
    using System.Windows.Forms; 
    using System.Xml.Linq; 
    using System.Net; 
    using System.IO; 

    // This method uses an map List<FieldMap> created from an XML file to map fields in the 
    // 2003 SharePoint list to the new 2007 SharePoint list. 
    private object PopulateFields(XElement batchItem, XElement listItem) 
    { 
     foreach (FieldMap mapItem in FieldMaps) 
     { 
      if (listItem.Attribute(mapItem.OldField) != null) 
      { 
       batchItem.Element("Method").Add(new XElement("Field", 
        new XAttribute("Name", mapItem.NewField), 
         listItem.Attribute(mapItem.OldField).Value)); 
      } 
     } 

     return listItem; 
    } 

    private static string GetID(XElement elem) 
    { 
     XNamespace z = "#RowsetSchema"; 

     XElement temp = elem.Descendants(z + "row").First(); 

     return temp.Attribute("ows_ID").Value; 
    } 

    private static string GetListItemIDString(XElement listItem) 
    { 
     XAttribute field = listItem.Attribute("ows_ID"); 

     return field.Value; 
    } 

    private void SetupServices() 
    { 
     _listsService2003 = new SPLists2003.Lists(); 

     _listsService2003.Url = "http://oldsite/_vti_bin/Lists.asmx"; 
     _listsService2003.Credentials = new System.Net.NetworkCredential("username", "password", "domain"); 

     _listsService2007 = new SPLists2007.Lists(); 

     _listsService2007.Url = "http://newsite/_vti_bin/Lists.asmx"; 
     _listsService2007.Credentials = new System.Net.NetworkCredential("username", "password", "domain"); 

    } 

    private string _listNameGuid = "SomeGuid";  // Unique ID for the old SharePoint List. 
    private string _viewNameGuid = "SomeGuid";  // Unique ID for the old SharePoint View that has all the fields needed. 
    private string _newListNameGuid = "SomeGuid"; // Unique ID for the new SharePoint List (target). 

    private SPLists2003.Lists _listsService2003; // WebService reference for the old SharePoint site (2003 or 2007 is fine). 
    private SPLists2007.Lists _listsService2007; // WebService reference for the new SharePoint site. 

    private List<FieldMap> FieldMaps; // Used to map the old list to the new list. Populated with a support function on startup. 

    class FieldMap 
    { 
     public string OldField { get; set; } 
     public string OldType { get; set; } 
     public string NewField { get; set; } 
     public string NewType { get; set; } 
    } 
+0

正確に私が必要としたもの。共有してくれてありがとう! – Mat

0

私はおそらくWebサービスで何かを実装しようとしています - 2007年には添付ファイルのURLがows_Attachements属性に表示されていて、それがあればかなり標準的なダウンロード/アップロードができます。私は2003年に何かをして以来、しばらくしてきましたが、私はそれが新しい分野ではないと思います。

2003年から適切なデータを取得できない場合は、サイト全体を2007年に移行してから、最新のAPIを使用して必要なデータを抽出することができます。

0

リスト(「コンテンツあり」)をテンプレートとして保存し、そのファイルを2007ポータルテンプレートに保存してから、その「カスタム」テンプレートを使用して新しいリストを作成しましたか?添付ファイルとアイテムの合計が10MBを超える場合は動作しません。2003年> 2007年には動作することを100%保証しているわけではありません.<に10分かかるはずです。既に。

0

私はこのプロジェクトを作成する必要がありました。同様のタスクのためにhttp://sourceforge.net/projects/splistcpを、が、変更および作成時間を保つため、ユーザーには私が先に地元のAPIを使用する必要がありました。あなたのアプローチの利点は、ソースとして2003年と2007年の両方に対してより簡単なサポートと思われます。

関連する問題