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
相关产品推荐
相关产品推荐

