C# 如何在另一个 Linq 语句中的 XmlAttributeCollection 上使用 Linq?

Posted

技术标签:

【中文标题】C# 如何在另一个 Linq 语句中的 XmlAttributeCollection 上使用 Linq?【英文标题】:C# How to use Linq on an XmlAttributeCollection within another Linq statement? 【发布时间】:2018-07-06 09:14:33 【问题描述】:

我有一个带有如下子元素的 XML 元素:

<Groups>
    <Group1 name="first" value="1" />
    <Group2 value="2" name="second" />
    <Group3 value="3" />
</Groups>

我正在使用一个已经存在的方法MyMethod() 来获取Groups 元素,该元素返回一个XmlNodeList 对象,我将其转换为XmlNode。之后,我想使用 Linq 语句仅获取那些具有 name 属性的组,并将这些名称存储在字符串列表中。

在下面的代码 sn-p 中,我试图检查 XML 节点的第一个属性名称是否等于 "name",但 "name" 属性可能并不总是第一个。您能否在这里帮助我并告诉我如何在下面的Attributes 属性上使用另一个 Linq 语句? Attributes 属性的类型为 XmlAttributeCollection。

List<string> result = MyMethod().Cast<XmlNode>()
    .Where(node => node.Attributes[0].Name == "name")
    .Select(node => node.Attributes[0].Value).ToList();

编辑: 我设法使用内置方法GetNamedItem找到了解决方案:

List<string> result = MyMethod().Cast<XmlNode>()
    .Where(node => node.Attributes?.GetNamedItem("name") != null)
    .Select(node => node.Attributes?.GetNamedItem("name").Value).ToList();

【问题讨论】:

你可以试试这样的: var groups = groups.Where(c => c.Elements().Count(b => b.Attribute("name") != null) > 0 );仅缺少字符串值列表中的条件。你能给我一个字符串值列表的例子吗? 【参考方案1】:

您对此有何看法:

List<string> result = MyMethod().Cast<XmlNode>()
    .SelectMany(node => node.Attributes).Where(a => a.Name == "name");

应该与你的目标相匹配,以获取具有特定名称的对象,完整代码变为:

List<string> result = MyMethod().Cast<XmlNode>()
        .SelectMany(node => node.Attributes).Where(a => a.Name == "name")
        .Select(a=> a.Value).ToList();

【讨论】:

【参考方案2】:

您问题的关键方法是扩展方法.SelectMany,它从集合集合返回扁平集合。

作为替代方案,您可以使用 LINQ to XML(听起来像是适合这项工作的工具;))

var document = XDocument.Load("pathToXmlFile");

// Here you can use more complex logic of "MyMehthod" 
var allGroups = document.Descendants("Groups");

var names = allGroups.SelectMany(groups => groups.Elements())
                     .Where(group => group.Attribute("name"))
                     .Where(attribute => attribute != null)
                     .Select(attribute => attribute.Value)
                     .ToList();

【讨论】:

感谢您的澄清。不幸的是,我无法修改MyMethod(),因为它已在多个地方使用。但我设法使用GetNamedItem("name") 内置方法找到了另一个解决方案。

以上是关于C# 如何在另一个 Linq 语句中的 XmlAttributeCollection 上使用 Linq?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 linq 查询 c# 中的 WHERE 语句后嵌入动态 OR 条件

使用 C# 中的 NEST 库调用 elasticsearch 时,如何向 linq 语句添加条件逻辑?

如何替换字典的 IF 语句? (C#,Linq)

C#中如何在另一个类中调用Form1窗体控件的方法呢?

C# linq 多表in语句查询

c# linq 动态多条件查询语句的写法