将元素的多个属性返回到列表。 LINQ to XML

时间:2013-03-13 18:59:42

标签: c# xml linq list lambda

我有一个类似于下面的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]”来拉取字符串。这给出了第七行的第四个值。

1 个答案:

答案 0 :(得分:0)

根据您的评论更新

  

&#34;我正在寻找的是能够做类似这样的事情&#34; testmultilist [0] [2]&#34; ,它会从中返回somevalue3   第一排虽然我不确定我是以正确的方式去做的。&#34;

除非您选择IEnumerable<XAttribute>而不是List<string>属性值,否则您非常接近。

以下是如何做到这一点(对任何偶然发现此事的人发表了评论:

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

        }
    }
}