使用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"); } } }
代码说明
- 加载原始XML:使用
XDocument.Load读取输入文件,记得替换为你的实际文件路径。 - 分组逻辑:通过
Descendants("Emp")获取所有Emp节点,再用GroupBy按<A.EMPLID>的值完成分组。 - 生成新文档:为每个分组创建新的
XDocument,保留原始的XML版本和编码声明,直接将分组中的所有<Emp>节点添加到新的<Connected>节点下——这样完全保留了原节点的结构和顺序。 - 保存文件:用
group.Key作为文件名,保存为对应的XML文件。
这样生成的文件就完全符合你的预期了!
内容的提问来源于stack exchange,提问作者user2897967
相关产品推荐
相关产品推荐

