如何基于子元素条件筛选XML元素并计算余额总和?
解决USTrade BalanceAmount求和问题
嘿,我明白你的需求了——你需要筛选出不包含code为3的Narrative的USTrade,然后把它们的BalanceAmount加起来,对吧?你的现有代码已经能找出符合条件的Narrative元素,但还需要关联回它们的父USTrade,并且避免重复计算(毕竟一个USTrade可能有多个符合条件的Narrative)。
先把你的XML内容放出来方便参考:
<USTrades> <USTrade> <BalanceAmount>1000</BalanceAmount> <Narratives> <Narrative code="1" description="Code 1"/> <Narrative code="2" description="Code 2"/> </Narratives> </USTrade> <USTrade> <BalanceAmount>2000</BalanceAmount> <Narratives> <Narrative code="3" description="Code 3"/> </Narratives> </USTrade> </USTrades>
方法一:直接筛选符合条件的USTrade(更直观)
我们可以直接定位到所有USTrade元素,然后筛选那些**没有任何Narrative的code等于"3"**的项,再提取BalanceAmount求和:
// 先获取所有USTrade元素,筛选出不包含code=3的Narrative的项 var validTrades = document.Descendants("USTrade") .Where(trade => !trade.Descendants("Narrative") .Any(n => (string)n.Attribute("code") == "3")); // 计算BalanceAmount的总和 int totalBalance = validTrades .Sum(trade => (int)trade.Element("BalanceAmount")); // 结果就是1000,符合预期
方法二:基于你已有的Narrative筛选结果关联父级
如果你想基于现有的筛选逻辑(找到code≠3的Narrative),可以通过Ancestors()方法找到对应的父USTrade,然后去重(避免同一个USTrade被多次计算),再求和:
// 先找到所有code≠3的Narrative,然后关联到父USTrade并去重 var validTrades = document.Descendants("Narrative") .Where(n => (string)n.Attribute("code") != "3") .Select(n => n.Ancestors("USTrade").First()) // 找到最近的USTrade父元素 .Distinct(); // 去重,因为一个USTrade可能有多个符合条件的Narrative // 计算总和 int totalBalance = validTrades .Sum(trade => (int)trade.Element("BalanceAmount"));
两种方法都能得到你想要的结果1000。第一种方法逻辑更直接,从父级开始筛选,适合大多数场景;第二种方法延续了你现有的思路,适合需要先处理Narrative元素再关联父级的情况。
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

