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

使用C#按EmpID拆分XML,生成对应独立XML的技术求助

C#按EmpID分组XML并生成独立文件的解决方案

你遇到的问题是因为当前代码错误地把同一个EmpID下的所有子元素合并到了单个<Emp>节点里,而没有保留原始XML中每个独立的<Emp>节点结构。下面是完整的解决思路和修正后的代码:

问题回顾

你需要将一份包含多个<Emp>节点的XML文件,按照<A.EMPLID>的值分组,生成每个EmpID对应的独立XML文件,且要保持原XML中节点的顺序和结构。

输入XML示例

<?xml version="1.0" encoding="utf-8"?>
<Connected>
<Emp>
<A.EMPLID>1</A.EMPLID>
<A.Phone>12##</A.Phone>
</Emp>
<Emp>
<A.EMPLID>1</A.EMPLID>
<A.Add>XXXXXXX</A.Add>
</Emp>
<Emp>
<A.EMPLID>2</A.EMPLID>
<A.Phone>##34</A.Phone>
</Emp>
<Emp>
<A.EMPLID>3</A.EMPLID>
</Emp>
<Emp>
<A.EMPLID>3</A.EMPLID>
<A.Add>XXXXXXX</A.Add>
</Emp>
</Connected>

预期输出

每个EmpID对应一个独立XML文件,例如:

  • 1.xml
<Connected>
<Emp>
<A.EMPLID>1</A.EMPLID>
<A.Phone>12##</A.Phone>
</Emp>
<Emp>
<A.EMPLID>1</A.EMPLID>
<A.Add>XXXXXXX</A.Add>
</Emp>
</Connected>
  • 2.xml
<Connected>
<Emp>
<A.EMPLID>2</A.EMPLID>
<A.Phone>##34</A.Phone>
</Emp>
</Connected>
  • 3.xml
<Connected>
<Emp>
<A.EMPLID>3</A.EMPLID>
</Emp>
<Emp>
<A.EMPLID>3</A.EMPLID>
<A.Add>XXXXXXX</A.Add>
</Emp>
</Connected>

问题原因分析

你当前的代码:

XElement x = new XElement("Connected",new XElement("Emp",new XElement("A.EMPLID", group.Key),group.Select(g => g.Elements().Where(e =>e.Name != "A.EMPLID"))));

错误地创建了单个<Emp>节点,然后把该EmpID下所有非<A.EMPLID>的元素都塞进去,这就导致了同ID的Emp节点被合并,完全不符合需求。

修正后的代码

正确的思路是:保留每个原始的<Emp>节点,只是将同一EmpID的<Emp>节点收集起来,包裹在新的<Connected>根节点下,然后写入对应的文件。

以下是完整的可运行代码:

using System;
using System.Linq;
using System.Xml.Linq;

class Program
{
    static void Main(string[] args)
    {
        // 加载原始XML文件(替换为你的实际文件路径)
        XDocument originalDoc = XDocument.Load("input.xml");
        
        // 按<A.EMPLID>的值分组
        var empGroups = originalDoc.Descendants("Emp")
                                   .GroupBy(emp => emp.Element("A.EMPLID")?.Value);
        
        foreach (var group in empGroups)
        {
            if (string.IsNullOrEmpty(group.Key))
                continue; // 跳过没有A.EMPLID的节点(可选逻辑)
            
            // 创建新的XML文档,保留原始编码声明,包裹分组内的所有Emp节点
            XDocument newDoc = new XDocument(
                new XDeclaration("1.0", "utf-8", null),
                new XElement("Connected", group)
            );
            
            // 保存为对应EmpID的XML文件
            newDoc.Save($"{group.Key}.xml");
        }
    }
}

代码说明

  1. 加载原始XML:使用XDocument.Load读取输入文件,记得替换为你的实际文件路径。
  2. 分组逻辑:通过Descendants("Emp")获取所有Emp节点,再用GroupBy按<A.EMPLID>的值完成分组。
  3. 生成新文档:为每个分组创建新的XDocument,保留原始的XML版本和编码声明,直接将分组中的所有<Emp>节点添加到新的<Connected>节点下——这样完全保留了原节点的结构和顺序。
  4. 保存文件:用group.Key作为文件名,保存为对应的XML文件。

这样生成的文件就完全符合你的预期了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:57:18