使用内容部署API,当文档不是时,ListItem重复了
-
16-10-2019 - |
题
我正在制作一种工具,将特定内容(列表项目和文档)从农场迁移/更新到另一个。有点像 SharePoint内容部署向导, ,但具有我客户的自定义规格。
使用内容部署API似乎很好 主意.
每个农场中的站点收集都是使用标准过程(使用自定义站点定义供应列表和ELT)创建的。我认为我不应该使用”保留对象“因为两个农场之间的GUID不同。
当我导出/导入数据时:
- 文档已正确添加/更新,但列表项目并非如此:
- 它不会更新现有列表项目。它总是添加新的。
因此,这是我的问题:更新现有列表项目的最佳解决方案是什么(它们之间没有相同的指导)?我想保留ListItem.ID(不是唯一的)。那可能吗 ?是否有解决方案告诉API将此项目还原到该项目?在最坏的情况下,我可以在导入之前删除现有项目,但是这些项目将失去其原始的ListItem.ID(INT)...
或者我可以忘记内容部署API ...
下图:我正在使用的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Deployment;
using Microsoft.SharePoint;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Export();
Import();
}
static void Import()
{
using (SPSite site = new SPSite("http://localhost:5555/sites/aa/"))
{
using (SPWeb web = site.OpenWeb())
{
SPImportSettings settings = new SPImportSettings();
settings.SiteUrl = site.Url;
settings.FileLocation = @"c:\export";
settings.BaseFileName = "blop.cmp";
settings.RetainObjectIdentity = false;
settings.CommandLineVerbose = true;
SPImport import = new SPImport(settings);
import.Run();
}
}
}
static void Export()
{
using (SPSite site = new SPSite("http://localhost:5555"))
{
using (SPWeb web = site.OpenWeb())
{
SPList listDocs = web.Lists["Shared Documents"];
SPListItem item = listDocs.Items[0];
SPExportObject obj = new SPExportObject();
obj.Id = item.UniqueId;
obj.Type = SPDeploymentObjectType.ListItem;
SPList listTasks = web.Lists["Tasks"];
SPListItem item2 = listTasks.Items[0];
SPExportObject obj2 = new SPExportObject();
obj2.Id = item2.UniqueId;
obj2.Type = SPDeploymentObjectType.ListItem;
SPExportSettings settings = new SPExportSettings();
settings.IncludeVersions = SPIncludeVersions.LastMajor;
settings.SiteUrl = site.Url;
settings.IncludeSecurity = SPIncludeSecurity.None;
settings.FileLocation = "C:\\export";
settings.BaseFileName = "blop";
settings.CommandLineVerbose = true;
settings.ExportObjects.Add(obj);
settings.ExportObjects.Add(obj2);
settings.OverwriteExistingDataFile = true;
SPExport export = new SPExport(settings);
export.Run();
}
}
}
}
}
解决方案
我找到了一个解决方案:
微软让我们修改 XML文件 用于导入数据:
所以我做了什么:
- 将导入设置设置为true。
- 修改XML文件以更改现有内容的指南
现在,有很多硬编码的东西,但是我认为,我将能够使其更通用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Deployment;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Export();
Import();
}
static void Import()
{
using (SPSite site = new SPSite("http://localhost:5555/sites/aa"))
{
using (SPWeb web = site.OpenWeb())
{
SPImportSettings settings = new SPImportSettings();
settings.SiteUrl = site.Url;
settings.FileLocation = @"c:\export";
settings.BaseFileName = "blop.cmp";
settings.RetainObjectIdentity = true;
settings.CommandLineVerbose = true;
SPImport import = new SPImport(settings);
import.Started += new EventHandler<SPDeploymentEventArgs>(import_Started);
import.Run();
}
}
}
static void import_Started(object sender, SPDeploymentEventArgs e)
{
Guid IDListOld = Guid.Empty;
Guid IDItemOld = Guid.Empty;
Guid IDWebOld = Guid.Empty;
Guid IDRootFolderOld = Guid.Empty;
Guid IDFolderTaskOld = Guid.Empty;
string IDCtypeOld = "";
Guid IDListNew = Guid.Empty;
Guid IDItemNew = Guid.Empty;
Guid IDWebNew = Guid.Empty;
Guid IDRootFolderNew = Guid.Empty;
Guid IDFolderTaskNew = Guid.Empty;
string IDCtypeNew = "";
using (SPSite site = new SPSite("http://localhost:5555"))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["Tasks"];
IDWebOld = web.ID;
IDListOld = list.ID;
IDItemOld = list.Items[0].UniqueId;
IDCtypeOld = list.Items[0].ContentType.Id.ToString();
IDRootFolderOld = list.RootFolder.UniqueId;
IDFolderTaskOld = web.GetFolder("Lists/Tasks/Task").UniqueId;
}
}
using (SPSite site = new SPSite("http://localhost:5555/sites/aa/"))
{
using (SPWeb web = site.OpenWeb())
{
SPList list = web.Lists["Tasks"];
IDWebNew = web.ID;
IDListNew = list.ID;
IDItemNew= list.Items[0].UniqueId;
IDCtypeNew = list.Items[0].ContentType.Id.ToString();
IDRootFolderNew = list.RootFolder.UniqueId;
IDFolderTaskNew = web.GetFolder("Lists/Tasks/Task").UniqueId;
}
}
DirectoryInfo d = new DirectoryInfo(e.TempDirectoryPath);
foreach (FileInfo info in d.GetFiles())
{
string content = "";
using (TextReader reader = File.OpenText(info.FullName))
{
content = reader.ReadToEnd();
content = content.Replace(IDItemOld.ToString(), IDItemNew.ToString());
content = content.Replace(IDWebOld.ToString(), IDWebNew.ToString());
content = content.Replace(IDListOld.ToString(), IDListNew.ToString());
content = content.Replace(IDCtypeOld.ToString(), IDCtypeNew.ToString());
content = content.Replace(IDRootFolderOld.ToString(), IDRootFolderNew.ToString());
content = content.Replace(IDFolderTaskOld.ToString(), IDFolderTaskNew.ToString());
}
File.WriteAllText(info.FullName, content);
}
}
static void Export()
{
using (SPSite site = new SPSite("http://localhost:5555"))
{
using (SPWeb web = site.OpenWeb())
{
SPList listTasks = web.Lists["Tasks"];
SPListItem item2 = listTasks.Items[0];
SPExportObject obj2 = new SPExportObject();
obj2.Id = item2.UniqueId;
obj2.Type = SPDeploymentObjectType.ListItem;
SPExportSettings settings = new SPExportSettings();
settings.IncludeVersions = SPIncludeVersions.LastMajor;
settings.SiteUrl = site.Url;
settings.IncludeSecurity = SPIncludeSecurity.None;
settings.FileLocation = "C:\\export";
settings.BaseFileName = "blop";
settings.CommandLineVerbose = true;
settings.ExportObjects.Add(obj2);
settings.OverwriteExistingDataFile = true;
SPExport export = new SPExport(settings);
export.Run();
}
}
}
}
}
顺便说一句,我不知道我是否应该编辑我的问题
其他提示
原因是SharePoint API本身处理版本的方式。当您启用使用重复的文件名和版本控制调用SPFOLDER.ADD()时,添加了新版本(而不是添加了新文件)。
您可能想尝试的一件事是在导入之前启用列表上的版本控制 - 这可能允许更新(保存版本)。
如果不是,恐怕您已经确定,唯一的方法是在运行导入之前清除列表。