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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:06:55