我有一个InfoPath 2010表单,作为内容类型发布。 我有一个启用了此内容类型的SharePoint库。 SharePoint库还启用了主要版本控制。
假设我已经在库中保存了表单实例并对其进行了多次编辑,以便创建多个版本。
我需要将两个版本相互比较以查看确切的更改。这是由SharePoint支持还是我应该使用代码(我现在正在检查SPDiffUtility)?
答案 0 :(得分:1)
不,SharePoint不允许您比较版本及其差异OOTB。
据我所知,SPDiffUtility
只是告诉你difference between two strings,但不支持那样的版本。比较版本仍然很容易:
using (SPWeb web = new SPSite("http://sharepoint").OpenWeb())
{
SPList list= web.Lists["Shared Documents"];
SPFile file = list.Files["mydoc.doc"];
//Get all the versions
SPFileVersionCollection fileVersionCollection = file.Versions;
//Get the first version
SPFileVersion fileVersion= fileVersionCollection[3];
//Get the data
byte [] fileBytes = version.OpenBinary();
}
基本上,您必须查看SPFile.Versions
collection并比较您拥有的版本。
问题是InfoPath将其文档存储为XML,因此您必须解析收到的XML以提取所有字段并查看它们之间的差异 - 解析XML的一个良好开端是创建一个类文件以便于访问代码来自xsd.exe
,如for example explained here。
答案 1 :(得分:0)
供参考,以下是我用来比较InfoPath表单的两个版本的完整代码
private static void CompareVersions()
{
using (SPWeb web = new SPSite("http://<website_name>").OpenWeb())
{
SPList lib = web.Lists["<library_name>"];
// Assuming that the file has at least 2 versions
var v1 = lib.RootFolder.Files[0].Versions[0];
myFields i1 = GetInstanceFromVersion(v1);
var v2 = lib.RootFolder.Files[0].Versions[1];
myFields i2 = GetInstanceFromVersion(v2);
Console.WriteLine(string.Format("{0,-20} | {1,-20} | {2,-20}", "Version", v1.VersionLabel, v2.VersionLabel));
// List the properties of both versions
Console.WriteLine(string.Format("{0,-20} | {1,-20} | {2,-20}", "Name", i1.Name, i2.Name));
}
}
private static myFields GetInstanceFromVersion(SPFileVersion version)
{
XmlTextReader reader = new XmlTextReader(version.OpenBinaryStream());
myFields fields = (myFields)new XmlSerializer(typeof(myFields)).Deserialize(reader);
return fields;
}