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



>我有一个XML元素,其子元素如下所示:

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

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

在下面的代码片段中,我尝试检查 XML 节点的第一个属性的名称是否等于"name""name"属性可能并不总是第一个属性。你能在这里帮我,告诉我如何在下面的属性上使用另一个 Linq 语句Attributes吗?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();

你怎么看:

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();

您问题的关键方法是扩展方法.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();

最新更新