比较SharePoint 2010库中的InfoPath版本与启用主要版本控制

时间:2011-05-01 09:35:25

标签: sharepoint-2010 infopath

我有一个InfoPath 2010表单,作为内容类型发布。 我有一个启用了此内容类型的SharePoint库。 SharePoint库还启用了主要版本控制。

假设我已经在库中保存了表单实例并对其进行了多次编辑,以便创建多个版本。

我需要将两个版本相互比较以查看确切的更改。这是由SharePoint支持还是我应该使用代码(我现在正在检查SPDiffUtility)?

2 个答案:

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