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