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; }
}
Genau das, was ich brauchte. Vielen Dank für das Teilen !! – Mat