2009-05-05 7 views

Antwort

3

Ich endete mit einem C# -Programm in Verbindung mit den SharePoint-Webdiensten, um dies zu erreichen. Ich habe auch die Erweiterungsmethoden (GetXElement, GetXmlNode) auf Eric Whites Blog here verwendet, um zwischen XMLNodes und XElements zu konvertieren, was die Zusammenarbeit mit XML von SharePoint erleichterte.

Nachfolgend finden Sie eine Vorlage für die meisten der Code benötigt Listendaten zu übertragen, einschließlich der Anlagen, von einer Sharepoint-Liste (entweder 2003 oder 2007) auf ein anderes:

1) Dies ist der Code, bewegt Anhänge nach Ein neues Element wurde zur Zielliste hinzugefügt.

// 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) Kodex, dass iteriert durch die alte Sharepoint-Liste und die neue auffüllt.

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) Sonstiges Support-Code für diese Probe.

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

Genau das, was ich brauchte. Vielen Dank für das Teilen !! – Mat

0

Ich würde wahrscheinlich versuchen, etwas mit den Webdiensten zu implementieren - ich weiß, dass für 2007 die Anhangs-URLs im ows_Attachements-Attribut angezeigt werden, und sobald Sie das haben, können Sie einen ziemlich standardmäßigen Download/Upload durchführen. Es ist eine Weile her, seit ich etwas mit 2003 gemacht habe, aber ich denke nicht, dass das ein neues Feld ist.

Wenn Sie Probleme haben, die richtigen Daten von 2003 zu erhalten, können Sie die gesamte Site immer auf 2007 migrieren und dann die gewünschten Daten mit der neuesten API extrahieren.

0

Haben Sie versucht, die Liste ("mit Inhalt") als Vorlage zu speichern, diese Datei in den Portalvorlagen 2007 zu speichern und dann eine neue Liste mit dieser "benutzerdefinierten" Vorlage zu erstellen? Das funktioniert nicht, wenn die Anhänge und Elemente insgesamt mehr als 10 MB groß sind, und ich bin nicht 100% sicher, dass das für 2003> 2007 funktioniert. Es sollte 10 Minuten dauern, also ist es einen Versuch wert, wenn Sie nicht haben bereits.

0

Ich hatte dieses Projekt zu erstellen: http://sourceforge.net/projects/splistcp für eine ähnliche Aufgabe, aber um die modifiziert und erstellt Zeit und Benutzer zu halten ich die lokale API auf dem Ziel verwenden musste. Der Vorteil Ihres Ansatzes scheint die leichtere Unterstützung sowohl für 2003 als auch für 2007 zu sein.

Verwandte Themen