1

I need to the following thing and just can't figure out how to do it. Maybe you could help me.

I uploaded a pdf file to a document library of a SP2013 with csom. Now i also want to tag the file using enterprise keywords.

How can this be done? I just don't find a solution for this.

Any help would be appreciated.

Regards alex

1 Answer 1

1

How to set Enterprise Keywords taxonomy field value using SharePoint CSOM

Since Taxonomy API is supported in SharePoint 2013 CSOM, the following example demonstrates how to set Enterprise Keywords field value:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.SharePoint.Client;
using Microsoft.SharePoint.Client.Taxonomy;

namespace SharePoint.Client.Taxonomy
{
    /// <summary>
    /// Enterpise Keyword Manager
    /// </summary>
    public class KeywordsManager
    {

        /// <summary>
        /// Set Enterprise Keyword Value
        /// </summary>
        /// <param name="item">List Item</param>
        /// <param name="values">Keyword values</param>
        public static void SetTaxKeywordValue(ListItem item,string[] values)
        {
            var ctx = item.Context;
            var list = item.ParentList;
            var field = list.Fields.GetByInternalNameOrTitle(TaxKeywordFieldName);
            var taxKeywordField = ctx.CastTo<TaxonomyField>(field);
            ctx.Load(item,i=>i[TaxKeywordFieldName]);
            var keywords = values.Select(value => EnsureKeyword(taxKeywordField, value)).ToList();
            taxKeywordField.SetFieldValueByValueCollection(item, new TaxonomyFieldValueCollection(ctx, GetTermsString(keywords), taxKeywordField));    
        }


        /// <summary>
        /// Ensure Keyword 
        /// </summary>
        /// <param name="taxField"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        private static Term EnsureKeyword(TaxonomyField taxField, string name)
        {
            var ctx = taxField.Context;
            var taxSession = TaxonomySession.GetTaxonomySession(ctx);
            var termStore = taxSession.GetDefaultKeywordsTermStore();
            var keywords = termStore.KeywordsTermSet.GetAllTerms();
            var result = ctx.LoadQuery(keywords.Where(k => k.Name == name));
            ctx.ExecuteQuery();
            var keyword = result.FirstOrDefault();
            if (keyword != null)
            {
                return keyword;
            }
            keyword = termStore.KeywordsTermSet.CreateTerm(name, DefaultLanguage, Guid.NewGuid());
            ctx.Load(keyword);
            ctx.ExecuteQuery();
            return keyword;
        }

        /// <summary>
        /// Retrieve formatted Term string
        /// </summary>
        /// <param name="term"></param>
        /// <returns></returns>
        private static string GetTermString(Term term)
        {
            return string.Format("-1;#{0}{1}{2}", term.Name, TaxonomyGuidLabelDelimiter,term.Id);
        }

        private static string GetTermsString(IEnumerable<Term> terms)
        {
            var termsString = terms.Select(GetTermString).ToList();
            return string.Join(";#", termsString);
        }



        private const string TaxKeywordFieldName = "TaxKeyword";

        private const int DefaultLanguage = 1033;

        private const string TaxonomyGuidLabelDelimiter = "|";
    }
}

Usage

using (var ctx = new ClientContext(webUri))
{
    var list = ctx.Web.Lists.GetByTitle(listTitle);
    var item = list.GetItemById(itemId);
    KeywordsManager.SetTaxKeywordValue(item,new []{"2013","2010"});
    item.Update();
    ctx.ExecuteQuery();
}

Results

enter image description here

enter image description here

For a more details please follow Enterprise Keywords management in Office 365 via CSOM post.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.