You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动