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

C#如何提取XML中<Daily>元素值为List<string>或逗号分隔字符串?

问题背景

需要从指定XML结构中提取所有<Daily>元素的文本值,原有C#代码运行后会将所有值无间隔拼接为fooddrinksleepdrivingwork,需要实现两种目标输出:

  • 得到List<string>类型的元素值集合
  • 得到逗号分隔的元素值字符串

对应XML结构如下:

<Person>
<Man>
    <Routine> 
        <Entry>
            <Daily>food</Daily>
            <Daily>drink</Daily>
            <Daily>sleep</Daily>
            <Daily>driving</Daily>
            <Daily>work</Daily>
        </Entry>
    </Routine>
</Man>
</Person>

原有问题代码:

verb = (from el in root.Elements("Entry").Descendants("Daily")
  select(string) el)
 .Aggregate(new StringBuilder(), (att, i) => att.Append(i), x => x.ToString());

Console.WriteLine(verb);

实现方案

1. 提取为List<string>集合

原有代码存在两个问题:一是Elements("Entry")只会查找当前root节点的直接子级Entry节点,和给出的XML层级不匹配;二是Aggregate拼接时未添加任何分隔符。直接调用ToList()即可得到目标集合,推荐两种节点匹配方式:

  • 跨层级匹配所有Daily节点(容错性高):
List<string> dailyValues = root.Descendants("Daily")
    .Select(el => (string)el)
    .ToList();
  • 严格按照XML层级匹配(避免误匹配其他位置的同名Daily节点):
List<string> dailyValues = root.Element("Man")
    .Element("Routine")
    .Element("Entry")
    .Elements("Daily")
    .Select(el => (string)el)
    .ToList();

2. 得到逗号分隔的字符串

优先使用string.Join实现,逻辑清晰无额外边界问题:

// 直接基于节点集合拼接,不需要先转List
string verb = string.Join(",", root.Descendants("Daily").Select(el => (string)el));
Console.WriteLine(verb);
// 输出结果:food,drink,sleep,driving,work

如果要沿用原有Aggregate写法,需要在拼接时追加分隔符,最后处理末尾多余的逗号(不推荐,易出边界问题):

string verb = root.Descendants("Daily")
    .Select(el => (string)el)
    .Aggregate(new StringBuilder(), (sb, val) => sb.Append(val).Append(','), sb => sb.ToString().TrimEnd(','));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:15:37