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

C#按DocEntryAR分组生成指定结构XML的问题求助

解决方案:使用LinQ分组修复XML生成逻辑

1. 确认实体类结构

先确保你的XML序列化类结构正确,示例如下(若你的类有差异,对应调整即可):

// 根节点类
[XmlRoot("TaxInvoices")]
public class TaxInvoices
{
    [XmlElement("TaxInvoice")]
    public List<TaxInvoice> InvoiceList { get; set; } = new List<TaxInvoice>();
}

// 发票头部类
public class TaxInvoice
{
    public string DocEntryAR { get; set; }
    public string BuyerDocNum { get; set; }
    public string BuyerName { get; set; }

    [XmlElement("GoodService")]
    public List<GoodService> GoodsServices { get; set; } = new List<GoodService>();
}

// 明细类
public class GoodService
{
    public string Opt { get; set; }
    public string ItemCode { get; set; }
    public string Name { get; set; }
    public string DocEntryAR2 { get; set; }
}

2. 从数据库取数并分组处理

假设你已从TaxXMLdb表查询出原始数据集合(命名为rawDataList,每条数据包含所需的全部字段),用LinQ分组构建正确的发票结构:

// 按DocEntryAR字段分组
var groupedData = rawDataList.GroupBy(item => item.DocEntryAR);

// 组装最终的XML对象
var taxInvoices = new TaxInvoices();
foreach (var group in groupedData)
{
    // 取分组内第一条数据的头部信息(同一DocEntryAR的头部字段值应一致)
    var firstItem = group.First();
    var invoice = new TaxInvoice
    {
        DocEntryAR = group.Key,
        BuyerDocNum = firstItem.BuyerDocNum,
        BuyerName = firstItem.BuyerName
    };

    // 填充当前发票的明细列表
    foreach (var detail in group)
    {
        invoice.GoodsServices.Add(new GoodService
        {
            Opt = detail.Opt,
            ItemCode = detail.ItemCode,
            Name = detail.Name,
            DocEntryAR2 = detail.DocEntryAR2
        });
    }

    taxInvoices.InvoiceList.Add(invoice);
}

3. XML序列化生成

用标准序列化逻辑生成目标XML:

var serializer = new XmlSerializer(typeof(TaxInvoices));
using (var writer = new StringWriter())
{
    serializer.Serialize(writer, taxInvoices);
    var xmlResult = writer.ToString();
    // 此处可输出或保存生成的XML
}

错误原因分析

你之前的代码问题大概率是未正确按DocEntryAR分组,或填充明细时复用了同一个GoodService集合实例,导致所有明细被追加到第一个发票的列表中,后续发票的明细集合指向同一空实例或被覆盖。通过LinQ的GroupBy可确保每个DocEntryAR对应独立的发票对象和明细集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:38:11