You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CSOM获取SharePoint Online指定文档库的托管元数据字段及关联术语集

用CSOM获取SharePoint Online文档库关联的托管元数据字段及术语集/术语

可以通过CSOM实现需求,核心思路是先定位文档库的托管元数据字段,再通过字段关联的术语集ID直接拉取对应术语,避免遍历整个术语库触发限流。以下是具体实现步骤:

1. 获取指定文档库的托管元数据字段及关联术语集信息

先加载目标文档库的所有字段,筛选出托管元数据类型的字段(包括单值和多值),然后提取这些字段关联的术语集ID、术语组ID等关键信息:

using (ClientContext ctx = new ClientContext("你的站点URL"))
{
    ctx.Credentials = new SharePointOnlineCredentials("用户名", ConvertToSecureString("密码"));
    
    // 获取目标文档库
    List targetLibrary = ctx.Web.Lists.GetByTitle("文档库名称");
    ctx.Load(targetLibrary.Fields);
    ctx.ExecuteQuery();

    // 筛选所有托管元数据字段
    var taxonomyFields = targetLibrary.Fields.Cast<Field>()
        .Where(f => f.TypeAsString == "TaxonomyFieldType" || f.TypeAsString == "TaxonomyFieldTypeMulti")
        .Select(f => ctx.CastTo<TaxonomyField>(f))
        .ToList();

    // 加载字段的核心属性
    foreach (var taxField in taxonomyFields)
    {
        ctx.Load(taxField, tf => tf.Title, tf => tf.TermSetId, tf => tf.GroupId);
    }
    ctx.ExecuteQuery();

    // 输出字段与术语集关联信息
    foreach (var taxField in taxonomyFields)
    {
        Console.WriteLine($"字段名称:{taxField.Title}");
        Console.WriteLine($"关联术语集ID:{taxField.TermSetId}");
        Console.WriteLine($"所属术语组ID:{taxField.GroupId}");
        Console.WriteLine("---");
    }
}

2. 通过术语集ID直接获取关联术语

拿到术语集ID后,直接从术语库中加载对应术语集及其下属术语,无需遍历整个术语库,有效避免限流:

// 承接上文的ClientContext实例
TaxonomySession taxonomySession = TaxonomySession.GetTaxonomySession(ctx);
ctx.Load(taxonomySession);
ctx.ExecuteQuery();

TermStore defaultTermStore = taxonomySession.GetDefaultSiteCollectionTermStore();
ctx.Load(defaultTermStore);
ctx.ExecuteQuery();

foreach (var taxField in taxonomyFields)
{
    // 通过术语集ID获取指定术语集
    TermSet termSet = defaultTermStore.GetTermSet(taxField.TermSetId);
    // 加载术语集下的术语(包含名称、ID、父术语)
    ctx.Load(termSet, ts => ts.Terms.Include(
        t => t.Name,
        t => t.Id,
        t => t.Parent
    ));
    ctx.ExecuteQuery();

    Console.WriteLine($"字段「{taxField.Title}」关联的术语:");
    foreach (var term in termSet.Terms)
    {
        Console.WriteLine($"- {term.Name} (ID: {term.Id})");
        // 递归加载子术语(如果有层级结构)
        LoadChildTerms(ctx, term);
    }
    Console.WriteLine("====");
}

// 递归加载子术语的辅助方法
void LoadChildTerms(ClientContext context, Term parentTerm)
{
    context.Load(parentTerm.Terms.Include(t => t.Name, t => t.Id, t => t.Parent));
    context.ExecuteQuery();
    foreach (var childTerm in parentTerm.Terms)
    {
        Console.WriteLine($"  - {childTerm.Name} (ID: {childTerm.Id})");
        LoadChildTerms(context, childTerm);
    }
}

关键注意事项

  • 权限要求:执行代码的账号需要具备目标文档库的读取权限,以及对应术语库的读取权限;
  • 性能优化:仅加载需要的属性(如Title、TermSetId),避免一次性加载所有字段属性;递归加载子术语时,可根据实际需求控制深度,避免不必要的请求;
  • 多值字段兼容:代码中已包含对TaxonomyFieldTypeMulti(多值托管元数据字段)的筛选,无需额外修改。

内容的提问来源于stack exchange,提问作者user611203

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:30:23