使用C#统计XML特定节点的唯一值并存储到变量
在C#中统计XML指定节点的唯一值数量
没问题,这事儿在C#里有几种简洁的实现方式,我结合你的XML示例给你详细说明:
首先注意下你的XML示例缺少根节点(XML语法要求必须有唯一根),我先帮你修正了,后续代码都会基于这个修正后的结构来写。
方法一:用Linq to XML(推荐,代码更简洁)
Linq to XML是处理XML的现代方式,语法清晰,代码量少。
先确保你引用了必要的命名空间:
using System.Linq; using System.Xml.Linq;
然后是完整代码:
// 修正后的XML内容(添加了<Employees>根节点) string xmlContent = @"<?xml version=""1.0"" encoding=""utf-8""?> <Employees> <Emp> <A.EMPLID>1</A.EMPLID> <A.Phone>1234</A.Phone> </Emp> <Emp> <A.EMPLID>2</A.EMPLID> <A.Phone>1234</A.Phone> </Emp> <Emp> <A.EMPLID>1</A.EMPLID> <A.Phone>1234</A.Phone> </Emp> </Employees>"; // 加载XML文档(如果是从文件读取,用XDocument.Load(@"你的文件路径")即可) XDocument xmlDoc = XDocument.Parse(xmlContent); // 指定你要统计的节点名称,比如这里的"A.EMPLID" string targetNode = "A.EMPLID"; // 统计唯一值数量并存储到变量 int uniqueNodeCount = xmlDoc.Descendants(targetNode) .Select(node => node.Value.Trim()) // 去除首尾空格,避免因空格误判重复 .Distinct() // 去重 .Count(); // 统计数量 // 验证结果(示例里这个值会是2) Console.WriteLine($"唯一{targetNode}的数量:{uniqueNodeCount}");
代码说明:
Descendants(targetNode):遍历XML中所有名为targetNode的节点,不管层级Select(node => node.Value.Trim()):提取节点的文本值,并去除首尾空格(防止类似" 1"和"1"被当成不同值)Distinct():自动过滤掉重复的值Count():统计去重后的元素数量,结果就是你要的唯一值数量
方法二:用传统XmlDocument+HashSet(适合习惯旧API的场景)
如果你更熟悉传统的XmlDocument API,也可以用HashSet来实现自动去重:
先引用命名空间:
using System.Xml; using System.Collections.Generic;
完整代码:
string xmlContent = @"<?xml version=""1.0"" encoding=""utf-8""?> <Employees> <Emp> <A.EMPLID>1</A.EMPLID> <A.Phone>1234</A.Phone> </Emp> <Emp> <A.EMPLID>2</A.EMPLID> <A.Phone>1234</A.Phone> </Emp> <Emp> <A.EMPLID>1</A.EMPLID> <A.Phone>1234</A.Phone> </Emp> </Employees>"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(xmlContent); // 从文件读取用xmlDoc.Load(@"文件路径") string targetNode = "A.EMPLID"; HashSet<string> uniqueValues = new HashSet<string>(); // 获取所有目标节点 XmlNodeList nodeList = xmlDoc.GetElementsByTagName(targetNode); foreach (XmlNode node in nodeList) { // 提取值并去重添加到HashSet uniqueValues.Add(node.InnerText.Trim()); } // 统计数量 int uniqueNodeCount = uniqueValues.Count; Console.WriteLine($"唯一{targetNode}的数量:{uniqueNodeCount}");
代码说明:
HashSet<string>:这个集合的特性是不允许重复元素,所以添加重复值时会自动忽略- 遍历所有目标节点,把处理后的文本值加入HashSet,最后HashSet的Count就是唯一值数量
额外注意点:
如果你的XML带有命名空间,需要在查询时指定命名空间。比如XML里有xmlns="http://your-namespace.com",那么Linq to XML的写法要改成:
XNamespace ns = "http://your-namespace.com"; int uniqueNodeCount = xmlDoc.Descendants(ns + targetNode) .Select(node => node.Value.Trim()) .Distinct() .Count();
内容的提问来源于stack exchange,提问作者user2897967




