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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:33