SharePoint / GetVersionCollection - 如何识别哪个版本?

时间:2015-01-15 05:56:35

标签: sharepoint sharepoint-2013 csom

我需要能够从SharePoint列表中的项查询旧字段值。我无法在服务器上执行代码(它需要与SharePoint Online / O365一起使用才能开始)。 到目前为止,我唯一允许我这样做的API是lists.asmx GetVersionCollection SOAP调用。 这允许我指定一个字段名称并返回一个XML结构,其中包含各种版本的值,以及修改时间和更改者 - 但是没有可靠的方法来实际识别哪个版本(即身份证或标签)。也就是说,如果我知道我需要从列表“文档”中的项目1的版本512获取标题值,我不会看到如何可靠地解析结果以确定哪个条目是版本512.虽然它们可能会返回在许多情况下,当没有字段值存在时(或者可能还没有创建字段时),实际上缺少条目。我已经尝试将修改日期与相应FileVersion项目的创建日期(我可以通过CSOM或REST获得)进行比较,虽然它在某些时候有效,但它不可靠。我还查看了lists.asmx GetVersion API的输出,但我也看不出它是如何有用的,因为所有版本的Created属性似乎都只是文件最初创建的日期。 对我来说似乎很奇怪,没有一种巧妙的方法可以做到这一点 - 如果我需要返回几个字段的信息,但只是为了一个版本,我必须做出大量的请求,返回的信息比我需要的多得多,然后我需要弄清楚如何在多值分类法字段等情况下解析返回的文本。 有人试过做类似的事吗?

由于

迪伦

2 个答案:

答案 0 :(得分:3)

我建议考虑以下选项:

使用SharePoint Web服务

这可能是使用Lists.GetVersionCollection Method的最好选择,但正如您在问题中正确提到的那样,您只能请求每个字段的版本信息。以下示例演示如何检索多个字段的版本信息并确定版本信息。

C#示例

public static Dictionary<string, List<VersionProperty>> GetVersionHistory(Uri webUri, string listName, int itemId, string[] fieldsToRetrieve)
{

        var listsProxy = new Lists.Lists();
        listsProxy.Url = webUri + "/_vti_bin/Lists.asmx";

        //Retrieve version labels
        var versionsResult = listsProxy.GetVersionCollection(listName, itemId.ToString(), "Version");
        var versionsXml = XElement.Parse(versionsResult.OuterXml);
        XNamespace xmlns = "http://schemas.microsoft.com/sharepoint/soap/";
        var versionLabels = versionsXml.Descendants(xmlns + "Version").Select(e => new VersionLabel()
        {
            VersionNo = e.Attribute("Version").Value,
            Modified = e.Attribute("Modified").Value,
            ModifiedBy = e.Attribute("Editor").Value
        }).ToList();

        //Retrieve properties
        var versionHistory = new Dictionary<string, List<VersionProperty>>();
        foreach (var f in fieldsToRetrieve)
        {
            versionsResult = listsProxy.GetVersionCollection(listName, itemId.ToString(), f);
            versionsXml = XElement.Parse(versionsResult.OuterXml);
            var properties = versionsXml.Descendants(xmlns + "Version").Select((e, i) => new VersionProperty { Label = versionLabels[i], Value = e.Attribute(f).Value });
            versionHistory[f] = properties.ToList(); 
        }
        return versionHistory;
}

,其中

public class VersionLabel
{
    public string VersionNo { get; set; }

    public string Modified { get; set; }

    public string ModifiedBy { get; set; }

}

public class VersionProperty
{
    public VersionLabel Label { get; set; }

    public string Value { get; set; }
}

用法

var listName = "Documents";
var itemId = 1;
var fieldsToRetrieve = new[] { "Title", "TaxKeyword" };
var versionHistory = GetVersionHistory(webUri, listName, itemId, fieldsToRetrieve);

结果

Versions.aspx申请页面

中提取版本历史记录

请求Versions.aspx开箱即用的SharePoint应用程序页面并从html内容中提取版本历史信息的另一个选项。

Versions.aspx页

enter image description here

以下示例演示了如何加载Versions.aspx页面内容(省略了负责提取版本信息的部分)。

C#示例

 public static  Dictionary<string, List<VersionProperty>> GetVersionsPageInfo(string webUrl,ICredentials credentials, Guid listId,int itemId)
 {
        var versionsPageUrl = string.Format("{0}/_layouts/versions.aspx?list={1}&ID={2}",webUrl, listId,itemId);
        using (var client = new WebClient())
        {
            client.Credentials = credentials;
            client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
            var content = client.DownloadString(versionsPageUrl);
            //extract version history info goes here.. 
        }
 }

答案 1 :(得分:0)

我回答了几乎有关版本here的类似问题。我希望这能以某种方式引导您走上正确的道路,但基本上该解决方案的作用是它通过FileVersion的所有ListItem。从那里你可以得到版本号。至于如何使用正确的版本号(如果是512,1048等),您可以阅读有关here的详细信息。