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

在C#中修改XML首次出现后的子节点名称

C# 修改XML中每个节点下的重复为

我来帮你搞定这个需求——你需要针对每个<Names>父节点独立处理,保留它下面的第一个<Name>节点,其余的<Name>全部重命名为<ChildName>。之前的代码问题在于全局查找所有<Name>节点,没有按<Names>分组处理,所以无法实现每个<Names>下单独操作的要求。

完整实现代码

假设你的IEnumerable<XElement>是包含所有<Names>节点的集合(或者你可以从XML根节点获取这些节点),下面是正确的代码:

// 遍历每个<Names>节点,逐个处理其下的<Name>子节点
foreach (var namesElement in yourXmlElements.Elements("Names"))
{
    // 获取当前<Names>节点下的所有直接<Name>子节点,转成List避免枚举时集合变更问题
    var nameNodes = namesElement.Elements("Name").ToList();
    
    // 只有当<Name>数量大于1时才需要修改
    if (nameNodes.Count > 1)
    {
        // 跳过第一个<Name>,处理剩下的所有节点
        foreach (var nameNode in nameNodes.Skip(1))
        {
            // 直接修改节点名称为ChildName
            nameNode.Name = "ChildName";
        }
    }
}

// 如果需要输出或保存修改后的XML,可以这样做
// Console.WriteLine(yourXmlRoot.ToString());
// yourXmlRoot.Save("modified.xml");

代码说明

  1. 按<Names>分组处理:用Elements("Names")遍历每个<Names>节点,确保每个父节点下的<Name>独立处理,不会互相干扰。
  2. 精准获取子节点:用namesElement.Elements("Name")而不是Descendants(),只获取当前<Names>的直接子节点,避免误处理嵌套在其他节点里的<Name>。
  3. 避免枚举异常:调用ToList()把节点集合转成列表,防止在修改节点名称时触发枚举集合变更的异常。
  4. 跳过第一个节点:Skip(1)直接跳过第一个<Name>,只修改后续的节点,完美匹配你的需求。

测试你的XML结构

针对你更新后的XML,运行这段代码后,每个<Names>节点都会变成预期的样子:

  • 第一个<Names>下的第二个<Name>会变成<ChildName>
  • 第二个<Names>下的第二、第三个<Name>会变成<ChildName>
  • 第三个<Names>下只有一个<Name>,保持不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:53:39