2007年のサイトの既存のリストに追加する必要があるSharePoint 2003サイトのリストにアイテムがあります。アイテムには添付ファイルがあります。SharePoint 2003の添付ファイルがあるアイテムをSharePoint 2007の既存のリストに転送する
これはPowerShellまたはC#を使用してどのように達成できますか?
2007年のサイトの既存のリストに追加する必要があるSharePoint 2003サイトのリストにアイテムがあります。アイテムには添付ファイルがあります。SharePoint 2003の添付ファイルがあるアイテムをSharePoint 2007の既存のリストに転送する
これはPowerShellまたはC#を使用してどのように達成できますか?
私は、これを達成するために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; }
}
私はおそらくWebサービスで何かを実装しようとしています - 2007年には添付ファイルのURLがows_Attachements属性に表示されていて、それがあればかなり標準的なダウンロード/アップロードができます。私は2003年に何かをして以来、しばらくしてきましたが、私はそれが新しい分野ではないと思います。
2003年から適切なデータを取得できない場合は、サイト全体を2007年に移行してから、最新のAPIを使用して必要なデータを抽出することができます。
リスト(「コンテンツあり」)をテンプレートとして保存し、そのファイルを2007ポータルテンプレートに保存してから、その「カスタム」テンプレートを使用して新しいリストを作成しましたか?添付ファイルとアイテムの合計が10MBを超える場合は動作しません。2003年> 2007年には動作することを100%保証しているわけではありません.<に10分かかるはずです。既に。
私はこのプロジェクトを作成する必要がありました。同様のタスクのためにhttp://sourceforge.net/projects/splistcpを、が、変更および作成時間を保つため、ユーザーには私が先に地元のAPIを使用する必要がありました。あなたのアプローチの利点は、ソースとして2003年と2007年の両方に対してより簡単なサポートと思われます。
正確に私が必要としたもの。共有してくれてありがとう! – Mat