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
相关产品推荐
相关产品推荐

