C#使用LINQ查询XElement树中重复节点的实现问题
问题1错误及修正
- 错误原因:
myShoppingList.Elements()已经获取到根节点下所有直接子节点(包含3个Pasadena和1个LasVegas节点),调用XPathSelectElement("Pasadena")是在每个子节点内部查询同名子节点,你的结构中Pasadena节点下没有同名子节点,因此所有分组Key均为null,无法得到正确结果。- 仅筛选节点名等于
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错误及修正
- 错误原因:
- XPath表达式写错:你要查询的是
LasVegas节点,表达式中写的是Pasadena,且属性名是Vendor不是Name,完全匹配不到目标节点。 - 冗余的
GroupBy逻辑和Where(g => g.Count() > 1)过滤条件会直接把仅有的1个符合条件的节点过滤掉。
- XPath表达式写错:你要查询的是
- 修正代码(获取
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错误及修正
- 错误原因:
- XPath相对路径完全错误,你写的
../../../White无法匹配到结构中的颜色节点,且存在语法错误:SelectMany(y => y})多了一个闭合大括号。 - 冗余的
GroupBy逻辑和Where(g => g.Count() > 1)过滤条件不符合需求,无法正确返回2个White节点对应的制造商信息。
- XPath相对路径完全错误,你写的
- 修正代码(查询所有
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
相关产品推荐
相关产品推荐

