Transfer Listenelemente mit Anlagen von Sharepoint 2003 zu einer bestehenden Liste in Sharepoint 2007

StackOverflow https://stackoverflow.com/questions/826999

Frage

Ich habe Elemente in einer Liste in einer Sharepoint 2003-Site, die ich auf eine bestehende Liste in einer 2007-Website hinzufügen muß. Die Einzelteile haben Attachments.

Wie dies erreicht werden kann Powershell oder C #?

War es hilfreich?

Lösung

endete ich mit dem Sharepoint-Web-Service unter Verwendung eines C # Programms in Verbindung, um dies zu erreichen. Ich habe auch die Erweiterungsmethoden (GetXElement, GetXmlNode) auf Eric White Blog hier zwischen XMLNodes und XElements zu konvertieren, die die XML-Daten aus Sharepoint erleichtert die Arbeit mit.

Im Folgenden 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 einen anderen:

1) Dies ist der Code bewegt Anhänge, nachdem ein neuer Punkt auf der 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) Code, der 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 dieses Beispiel.

    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; }
    }

Andere Tipps

ich wahrscheinlich versuchen würde, etwas mit den Web-Diensten Umsetzung - ich weiß, für das Jahr 2007, dass die Befestigungs Urls in dem ows_Attachements Attribute angezeigt, und wenn Sie haben, dass Sie ein ziemlich Standard-Download / Upload tun können. Es ist schon eine Weile her, seit ich mit 2003 tat nichts, aber ich glaube nicht, das ist ein neues Feld.

Wenn Sie Probleme haben, die richtigen Daten aus dem Jahr 2003 erhalten, können Sie immer die gesamte Website bis 2007 migrieren und dann die Daten extrahieren Sie die aktuelle API verwenden möchten.

Haben Sie versucht, die Liste speichern ( „mit Inhalt“) als Vorlage, die Datei auf die 2007-Portal Vorlagen speichern, erstellen Sie eine neue Liste mit der „custom“ Vorlage? Das funktioniert nicht, wenn die Anlagen und Einzelteile mehr als 10 MB insgesamt, und ich bin mir nicht 100% sicher, dass die für das Jahr 2003 arbeiten werde> 2007 sollte es dauern <10 Minuten, so dass es einen Versuch wert, wenn Sie nicht haben bereits.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top