如何用LINQ to XML(Lambda语法)构建Payment与Invoice父子对象
当然可以一次搞定!不用多次调用API
完全没问题,咱们可以用LINQ to XML的Lambda语法一次性把整个XML数据解析成带过滤后子Invoice的Payment集合,根本不需要分多次调用API。我给你一步步拆解实现方式:
1. 先定义你的模型类
首先得确保PaymentModel和InvoiceModel的结构符合需求:
public class PaymentModel { public string PaymentId { get; set; } // 其他Payment属性,比如Amount、PaymentDate等 public List<InvoiceModel> Invoices { get; set; } = new List<InvoiceModel>(); } public class InvoiceModel { public string InvoiceId { get; set; } // 其他Invoice属性,比如InvoiceAmount、DueDate等 }
2. LINQ to XML Lambda语法解析+过滤
假设你的API返回的XML结构大概是这样的(如果实际结构不同,只需要调整节点名称即可):
<Payments> <Payment> <PaymentId>P001</PaymentId> <Amount>1000</Amount> <Invoices> <Invoice> <InvoiceId>INV-K-001</InvoiceId> <InvoiceAmount>500</InvoiceAmount> </Invoice> <Invoice> <InvoiceId>INV-002</InvoiceId> <!-- 这个会被过滤掉,因为不含K --> <InvoiceAmount>500</InvoiceAmount> </Invoice> </Invoices> </Payment> <Payment> <PaymentId>P002</PaymentId> <Amount>800</Amount> <Invoices> <Invoice> <InvoiceId>K-INV-003</InvoiceId> <InvoiceAmount>800</InvoiceAmount> </Invoice> </Invoices> </Payment> </Payments>
那解析代码可以这么写:
// 假设你已经从API获取到了XML字符串,这里用XDocument.Parse加载 var xmlDoc = XDocument.Parse(apiResponseXml); var paymentList = xmlDoc.Root .Elements("Payment") // 获取所有Payment节点 .Select(paymentNode => new PaymentModel { PaymentId = paymentNode.Element("PaymentId")?.Value, Amount = decimal.Parse(paymentNode.Element("Amount")?.Value ?? "0"), // 处理子Invoice,同时过滤掉InvoiceId不含"K"的 Invoices = paymentNode.Element("Invoices")? .Elements("Invoice") .Where(invoiceNode => !string.IsNullOrEmpty(invoiceNode.Element("InvoiceId")?.Value) && invoiceNode.Element("InvoiceId").Value.Contains("K")) .Select(invoiceNode => new InvoiceModel { InvoiceId = invoiceNode.Element("InvoiceId")?.Value, InvoiceAmount = decimal.Parse(invoiceNode.Element("InvoiceAmount")?.Value ?? "0") }) .ToList() ?? new List<InvoiceModel>() }) .ToList();
关键要点说明
- 单次解析完成:整个过程只需要加载一次API返回的XML,一次性遍历所有Payment和对应的Invoice节点,不需要多次调用API。
- 过滤逻辑:通过
Where(invoiceNode => invoiceNode.Element("InvoiceId").Value.Contains("K"))精准过滤掉不符合条件的Invoice,只保留包含字母K的。 - 空值处理:用
?.和??处理可能的空节点,避免空引用异常,让代码更健壮。 - Lambda语法:全程使用LINQ的Lambda链式调用,代码简洁清晰,符合你的需求。
如果你的实际XML节点名称和我假设的不一样,只需要把Element("XXX")里的节点名改成你实际的即可,核心逻辑是通用的。
内容的提问来源于stack exchange,提问作者webworm
相关产品推荐
相关产品推荐

