Сравнить версии InfoPath в библиотеке SharePoint 2010 с включенным основным управлением версиями - PullRequest
1 голос
/ 01 мая 2011

У меня есть форма InfoPath 2010, опубликованная в виде типа контента. У меня есть библиотека SharePoint, в которой включен этот тип контента. В библиотеке SharePoint также включено основное управление версиями.

Допустим, я сохранил экземпляр формы в библиотеке и отредактировал его несколько раз, чтобы было создано несколько версий.

Мне нужно сравнить 2 версии друг с другом, чтобы увидеть точные изменения. Поддерживается ли это в SharePoint или я должен использовать для этого код (сейчас я изучаю SPDiffUtility)?

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Нет, SharePoint не позволяет сравнивать версии и их различия OOTB.

Насколько я могу сказать, SPDiffUtility просто говорит вам разницу между двумя строками , но не поддерживает версии просто так. Сравнение версии все еще очень просто:

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 и сравнить имеющиеся у вас версии.

Проблема в том, что InfoPath хранит свой документ в формате XML, поэтому вам придется анализировать полученный XML-файл, чтобы извлечь все поля и увидеть их различия. Хорошим началом анализа XML-файла является создание файла класса для более легкого доступа к нему. код через xsd.exe как например, объясненный здесь .

0 голосов
/ 03 мая 2011

Для справки вот полный код, который я использовал для сравнения 2 версий формы 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;
}
...