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

C#使用LINQ查询XElement树中重复节点的实现问题

问题1错误及修正

  • 错误原因:
    1. myShoppingList.Elements()已经获取到根节点下所有直接子节点(包含3个Pasadena和1个LasVegas节点),调用XPathSelectElement("Pasadena")是在每个子节点内部查询同名子节点,你的结构中Pasadena节点下没有同名子节点,因此所有分组Key均为null,无法得到正确结果。
    2. 仅筛选节点名等于Pasadena的节点不需要使用GroupBy分组逻辑,属于冗余设计,且Where(g => g.Count() > 1)的过滤条件不符合你的需求。
  • 修正代码(获取所有3个Pasadena节点):
var query = myShoppingList.Elements("Pasadena").ToList();

如果需要同时统计数量:

var query = myShoppingList.Elements()
    .GroupBy(x => x.Name == "Pasadena")
    .Where(g => g.Key)
    .Select(g => new { Elements = g.ToList(), Counter = g.Count() })
    .ToList();

问题2错误及修正

  • 错误原因:
    1. XPath表达式写错:你要查询的是LasVegas节点,表达式中写的是Pasadena,且属性名是Vendor不是Name,完全匹配不到目标节点。
    2. 冗余的GroupBy逻辑和Where(g => g.Count() > 1)过滤条件会直接把仅有的1个符合条件的节点过滤掉。
  • 修正代码(获取LasVegas下Vendor为Tesla的节点):
// 原生LINQ写法
var query = myShoppingList.Elements("LasVegas")
    .Where(x => x.Attribute("Vendor")?.Value == "Tesla")
    .ToList();

// XPath写法
var query = myShoppingList.XPathSelectElements("./LasVegas[@Vendor='Tesla']").ToList();

问题3错误及修正

  • 错误原因:
    1. XPath相对路径完全错误,你写的../../../White无法匹配到结构中的颜色节点,且存在语法错误:SelectMany(y => y})多了一个闭合大括号。
    2. 冗余的GroupBy逻辑和Where(g => g.Count() > 1)过滤条件不符合需求,无法正确返回2个White节点对应的制造商信息。
  • 修正代码(查询所有White节点并返回对应制造商):
// 原生LINQ写法
var query = myShoppingList.Descendants("White")
    .Select(x => new {
        WhiteNode = x,
        Vendor = x.Ancestors().First(a => a.Attribute("Vendor") != null).Attribute("Vendor").Value
    })
    .ToList();

// XPath写法
var query = myShoppingList.XPathSelectElements("//White")
    .Select(x => new {
        WhiteNode = x,
        Vendor = x.XPathSelectElement("../../..").Attribute("Vendor").Value
    })
    .ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:02