0

我有一个带有子元素的 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();
4

2 回答 2

0

你怎么看:

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();
于 2018-07-06T09:25:00.513 回答
0

您问题的关键方法是扩展方法.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();
于 2018-07-06T09:59:57.370 回答