C#实现删除重复发票并将重复条目值合并至首个条目
合并XML中重复发票并求和数值字段的实现方案
你需要的是根据Hash值去重发票,同时将重复条目的相关数值合并到主条目里对吧?我帮你把代码补全并优化了,直接就能运行:
using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; namespace ConsoleApplication2 { class Program { // XML文件路径 private const string FILE_PATH = "ccc.xml"; static void Main(string[] args) { try { // 加载XML文档 XDocument doc = XDocument.Load(FILE_PATH); // 获取所有发票节点,假设节点名为"Invoice",Hash字段名为"Hash" var invoices = doc.Descendants("Invoice").ToList(); // 按Hash值分组,找出重复的发票 var groupedInvoices = invoices.GroupBy(inv => inv.Element("Hash")?.Value); foreach (var group in groupedInvoices) { // 如果分组里只有一条,跳过 if (group.Count() <= 1) continue; // 取第一条作为主条目 var mainInvoice = group.First(); // 遍历其他重复条目,求和相关字段(这里假设字段为"Amount"和"Quantity",你可以根据实际调整) foreach (var duplicate in group.Skip(1)) { // 求和金额 if (mainInvoice.Element("Amount") != null && duplicate.Element("Amount") != null) { if (decimal.TryParse(mainInvoice.Element("Amount").Value, out decimal mainAmount) && decimal.TryParse(duplicate.Element("Amount").Value, out decimal dupAmount)) { mainInvoice.Element("Amount").Value = (mainAmount + dupAmount).ToString(); } } // 求和数量(示例字段,按需修改) if (mainInvoice.Element("Quantity") != null && duplicate.Element("Quantity") != null) { if (int.TryParse(mainInvoice.Element("Quantity").Value, out int mainQty) && int.TryParse(duplicate.Element("Quantity").Value, out int dupQty)) { mainInvoice.Element("Quantity").Value = (mainQty + dupQty).ToString(); } } // 移除重复条目 duplicate.Remove(); } } // 保存处理后的XML doc.Save(FILE_PATH); Console.WriteLine("重复发票已成功合并!"); } catch (Exception ex) { Console.WriteLine($"处理过程中出错:{ex.Message}"); } } } }
关键说明:
- 分组逻辑:通过
GroupBy按发票的Hash值分组,把所有重复的发票归到同一组 - 数值求和:这里示例了金额(
Amount)和数量(Quantity)的求和逻辑,你可以根据实际的XML字段名修改这些字段名 - 错误处理:加入了
try-catch块捕获异常,避免程序崩溃 - 保存结果:处理完成后直接覆盖原XML文件,如果你想保留原文件,可以修改
Save的路径为新文件名
需要注意的是,你要确保XML里的发票节点名是Invoice,Hash字段名是Hash,如果实际结构不同,记得调整对应的节点和元素名称哦!
内容的提问来源于stack exchange,提问作者Kacelyn Nardos
相关产品推荐
相关产品推荐

