【问题标题】:Return multiple attributes of an element to a list. LINQ to XML将元素的多个属性返回到列表。 LINQ 转 XML
【发布时间】:2013-03-13 18:59:41
【问题描述】:

我有一个类似于下面的 xml。

<rowset>
<row attribute1="somevalue1" attribute2="somevalue2" attribute3="somevalue3" attribute4="somevalue4"/>
<row attribute1="somevalue1" attribute2="somevalue2" attribute3="somevalue3" attribute4="somevalue4"/>
<row attribute1="somevalue1" attribute2="somevalue2" attribute3="somevalue3" attribute4="somevalue4"/>
<row attribute1="somevalue1" attribute2="somevalue2" attribute3="somevalue3" attribute4="somevalue4"/>
</rowset>

我要做的是返回一个列表,其中每一行都是一个列表项,属性将是子项。我得到的最接近的是以下语句,但我无法让它返回通过计数和查看在调试中可以看到的值。

var skillslist = testmultilist.Descendants("row").Select(a => a.Attributes()).ToList();

任何帮助将不胜感激。

这就是我最后的做法。

var skillslist = testmultilist.Descendants("row").Select(a => a.Attributes().Select(c => c.Value).ToList()).ToList();

我可以使用“string derp = testmultilist[6][3]”从中提取字符串。这给出了第七行的第四个 somevalue。

【问题讨论】:

  • 我不确定您所说的“无法通过计数和查看来返回我在调试中可以看到的值”是什么意思。当您尝试在代码中迭代 skillslist 时会发生什么?
  • System.Xml.Linq.XElement+d_0 是我为每个列表项得到的。通过右键单击技能列表,单击加号,然后单击结果,它会显示子项和值,即 somevalue1、somevalue2 等。
  • 伙计,我的回答是这样做的(你编辑到你的问题中)所以现在我很困惑你还需要什么?
  • 抱歉,我从未在第一次输入您的示例中的第二个 ToList。标记为正确,因为第一次是正确的;)谢谢。

标签: c# xml linq list lambda


【解决方案1】:

根据您的评论更新

“我一直在寻找的是能够做类似于“testmultilist[0][2]” 的事情,它会从 第一行,虽然我不确定我的做法是否正确。”

再次,您非常接近,除了您选择 IEnumerable&lt;XAttribute&gt; 而不是 List&lt;string&gt; 的属性值。

这是如何做到这一点的(评论给任何偶然发现的人:

    var skillslist = testmultilist.Elements("row")            // Get the Elements
        .Select(e => e.Attributes()                           // Select the attributes per element (returns IEnumerable<XAttribute>)
            .Select(a => a.Value)                             // Working on the attributes, get only the value
            .ToList()                                         // Must be a list here in order to use indexer [] to access items; this creates the innter List<> items
        )                                                     // this completes the selection of each outer "row" item
        .ToList();

测试应用:

using System;
using System.Linq;
using System.Xml.Linq;

namespace XLinqAttributeGetNames
{
    class Program
    {
        static void Main(string[] args)
        {
            XElement testmultilist = XElement.Parse(@"<rowset>
                <row attribute1=""somevalue1"" attribute2=""somevalue2"" attribute3=""somevalue3"" attribute4=""somevalue4""/>
                <row attribute1=""somevalue1"" attribute2=""somevalue2"" attribute3=""somevalue3"" attribute4=""somevalue4""/>
                <row attribute1=""somevalue1"" attribute2=""somevalue2"" attribute3=""somevalue3"" attribute4=""somevalue4""/>
                <row attribute1=""somevalue1"" attribute2=""somevalue2"" attribute3=""somevalue3"" attribute4=""somevalue4""/>
                </rowset>");

            var skillslist = testmultilist.Elements("row")
                .Select(s => s.Attributes()
                    .Select(a => a.Value)
                    .ToList()
                )
                .ToList();

            for (var i = 0; i < skillslist.Count; i++)
            {
                Console.WriteLine("Row " + i);
                for (var j = 0; j < skillslist[i].Count(); j++)
                {
                    Console.WriteLine("Item " + j + ": " + skillslist[i][j]);
                }
                Console.WriteLine();
            }
            Console.ReadKey();

        }
    }
}

【讨论】:

  • .Attributes() 是否接受IEnumerable 并自动生成实际的SelectMany
  • @AgentFire - .Attributes() 是一种 Xlinq 扩展方法,作用于当前的 IEnumerable,可以带一个参数按名称过滤集合。它确实变平(执行 SelectMany)并返回一个列表。
  • 这将所有属性的列表作为单个列表项提供,而我正在寻找的是能够执行类似于此“testmultilist [0] [2]”的操作,这将返回 somevalue3第一行虽然我不确定我是否以正确的方式进行。
  • @user2166892 根据您上面的评论查看我更改/更新的答案
  • 您好,感谢您的回答,但我现在在一个 LINQ 语句中找到了答案,见上文。 rowset 元素上方和下方还有其他元素,抱歉,我应该在顶部添加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2021-11-11
相关资源
最近更新 更多