[英]C# How to use Linq on an XmlAttributeCollection within another Linq statement?
我有一个带有子元素的XML元素,如下所示:
<Groups>
<Group1 name="first" value="1" />
<Group2 value="2" name="second" />
<Group3 value="3" />
</Groups>
我使用一个已经存在的方法MyMethod()
来获取Groups
元素,该元素返回一个XmlNodeList
对象,该对象已转换为XmlNode
。 之后,我想使用Linq语句仅获取其中具有name
属性的那些组,并将这些名称存储在字符串列表中。
在下面的代码片段中,我试图检查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();
您对此有何看法:
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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.