簡體   English   中英

SharePoint CAML查詢-如何以編程方式讀取MetaInfo字段值?

[英]SharePoint CAML Query - How to read MetaInfo field values programmatically?

我正在使用C#和SharePoint 客戶端對象模型跨文件夾進行遞歸查詢,以獲取返回的集合中的文件屬性。

我可以通過指定字段名稱來成功地從ListItemCollection讀取值:

listItem["Title"] 

但是有一種方法可以讀取其中的各個值

listItem["MetaInfo"]

它似乎具有多個自定義元數據值,我想是由Microsoft Office應用程序設置的??? 我可以將其轉換為類型以獲取單個值嗎?

我不想解析字符串。

MetaInfo功能調試器中的數據如下所示:

display_urn\\:schemas-microsoft-com\\:office\\:office#Editor:SW|System Account
   \nvti_parserversion:SR|14.0.0.7149
   \nvti_folderitemcount:IR|0
   ContentTypeId:SW|0x0101008B5F2095338FE647A7F89B5275681D66
   vti_title:SW|Mr Foo Howe 26-03-2014
   vti_author:SW|MYDOMAIN\\\\jblogs
   Document Type:SW|Contract Note
   vti_modifiedby:SR|SHAREPOINT\\\\system
   vti_foldersubfolderitemcount:IR|0
   display_urn\\:schemas-microsoft-com\\:office\\:office#Author:SW|Blogs, Jo

感謝您的幫助,請原諒我的無知-這是我第一次使用SharePoint :)

SharePoint CSOM API不包含用於解析MetaInfo字段值的內置方法,該方法返回與指定客戶端對象相關聯的元數據信息的字符串表示形式。

您可以考慮以下用於解析MetaInfo字段值的方法:

/// <summary>
/// Parse MetaInfo field value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private static Dictionary<string, string> ParseMetaInfo(string value)
{
    return value.Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
            .Select(x => x.Split(new[] {":"}, StringSplitOptions.RemoveEmptyEntries))
            .ToDictionary(x => x[0], x => x[1]);
}

用法

var list = ctx.Web.Lists.GetByTitle(targetListTitle);
var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
ctx.Load(items, icol => icol.Include( i => i["MetaInfo"]));
//ctx.Load(items);
ctx.ExecuteQuery();

foreach (var item in items)
{
    var metaInfo = (string) item["MetaInfo"];
    var metaInfoValue = ParseMetaInfo(metaInfo);
    //..

}

我已將Vadim的解決方案標記為答案,但是我認為我會發布解決方案,這是我在看到他的答復之前所做的。

下面的實現使用擴展方法和正則表達式匹配來提取值-如果您已經知道要讀取的字段(即它們是預定義的),則很有用-如果您不知道將要處理的內容並且它們是動態的那么以上答案可能對您更有用。

您可能需要檢索的MetaInfo字段中定義元信息屬性的擴展方法和類:

public static class Extensions
{

    public static string[] DocMetaInfoFields =
    {
        MetaInfoFields.Title, MetaInfoFields.Author,
        MetaInfoFields.DocumentType, MetaInfoFields.ModifiedBy
    };

    public static string GetDocumentType(this object metaInfo)
    {
        var match = GetRegexMatch(metaInfo as string, MetaInfoFields.DocumentType);
        return (match.Groups.Count > 1)
            ? match.Groups[1].Value
            : string.Empty;
    }

    public static Dictionary<string, string> GetDocMetaProperties(this object metaInfo)
    {
        var properties = new Dictionary<string, string>();
        foreach (var field in DocMetaInfoFields)
        {
            var match = GetRegexMatch(metaInfo as string, field);
            properties.Add(field,
                (match.Groups.Count > 1)
                    ? match.Groups[1].Value
                    : string.Empty);
        }
        return properties;
    }

    public static StringBuilder FormatCamlValues(this StringBuilder sb, string valueTag, string listName,
        IEnumerable<string> clientReferences)
    {
        foreach (var clientRef in clientReferences)
        {
            sb.AppendFormat(valueTag, listName, clientRef);
        }
        return sb;
    }

    public static List<ClientDocumentListItem> ToClientDocumentList(this ListItemCollection files)
    {
        return files.ToList().ConvertAll(ListItemToClientDocItem);
    }

    private static Match GetRegexMatch(string searchString, string fieldName)
    {
        string regexCapture = string.Format(@"^{0}:\w{{2}}\|([^.(\r|\n)]*)[\r\n|\n\r]+\w", fieldName);
        return Regex.Match(searchString, regexCapture, RegexOptions.Multiline);
    }
}

/// <summary>
/// Defines the field names inside the MetaInfo composite field returned while using the SharePoint client object CamlQuery() method
/// </summary>
public static class MetaInfoFields
{
    public static string MetaInfoFieldName = "MetaInfo";
    public static string Title = "vti_title";
    public static string Author = "vti_author";
    public static string DocumentType = "Document Type";
    public static string ModifiedBy = "vti_modifiedby";
}

用法

var list = ctx.Web.Lists.GetByTitle(targetListTitle);
var items = list.GetItems(CamlQuery.CreateAllItemsQuery());
ctx.Load(items, icol => icol.Include( i => i[MetaInfoFields.MetaInfoFieldName]));
//ctx.Load(items);
ctx.ExecuteQuery();

var docProperties = GetDocMetaProperties(listItem[MetaInfoFields.MetaInfoFieldName]);

var title = docProperties[MetaInfoFields.Title];    
var createdBy = docProperties[MetaInfoFields.Author];    
var modifiedBy = docProperties[MetaInfoFields.ModifiedBy];    
var type = docProperties[MetaInfoFields.DocumentType];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM