نقل عناصر القائمة ذات المرفقات من SharePoint 2003 إلى قائمة موجودة في SharePoint 2007

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

سؤال

لدي عناصر في قائمة في موقع SharePoint 2003 وأحتاج إلى إضافتها إلى قائمة موجودة في موقع 2007.العناصر لديها مرفقات.

كيف يمكن تحقيق ذلك باستخدام PowerShell أو C#؟

هل كانت مفيدة؟

المحلول

وانتهى بي الأمر باستخدام برنامج C# بالاشتراك مع خدمات ويب SharePoint لإنجاز ذلك.لقد استخدمت أيضًا طرق الامتداد (GetXElement، GetXmlNode) على مدونة Eric White هنا للتحويل بين XMLNodes وXElements مما جعل التعامل مع XML من SharePoint أسهل.

يوجد أدناه قالب لمعظم التعليمات البرمجية اللازمة لنقل بيانات القائمة، بما في ذلك المرفقات، من إحدى قوائم SharePoint (إما 2003 أو 2007) إلى قائمة أخرى:

1) هذا هو الكود الذي ينقل المرفقات بعد إضافة عنصر جديد إلى القائمة المستهدفة.

// 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) التعليمات البرمجية التي تتكرر من خلال قائمة SharePoint القديمة وتملأ القائمة الجديدة.

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

نصائح أخرى

ربما سأحاول تنفيذ شيء ما باستخدام خدمات الويب - أعلم أنه بالنسبة لعام 2007، تظهر عناوين URL للمرفقات في السمة ows_Attachements، وبمجرد الانتهاء من ذلك، يمكنك إجراء تنزيل/تحميل قياسي إلى حد ما.لقد مر وقت طويل منذ أن قمت بأي شيء في عام 2003، لكنني لا أعتقد أن هذا مجال جديد.

إذا كانت لديك مشكلة في الحصول على البيانات الصحيحة من عام 2003، فيمكنك دائمًا ترحيل الموقع بأكمله إلى عام 2007 ثم استخراج البيانات التي تريدها باستخدام أحدث واجهة برمجة التطبيقات.

هل حاولت إنقاذ قائمة ( "مع المحتوى") كنموذج، حفظ هذا الملف إلى قوالب البوابة عام 2007، ثم إنشاء قائمة جديدة باستخدام أن "العرف" القالب؟ هذا لن تعمل إذا المرفقات والبنود الكاملة أكثر من 10MB، ولست متأكدا من أن ذلك سوف تعمل لعام 2003> عام 2007. وينبغي أن تتخذ <10 دقيقة بنسبة 100٪، لذلك فمن يستحق المحاولة إذا كان لديك لا بالفعل.

وكان لي لإنشاء هذا المشروع: http://sourceforge.net/projects/splistcp للحصول على مهمة مماثلة، ولكن من أجل الحفاظ على الوقت المعدلة وخلق والمستخدم اضطررت لاستخدام API المحلي على الوجهة. ويبدو أن صالح نهجكم ليكون من الأسهل الدعم لعامي 2003 و 2007 كمصدر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top