将元素的多个属性返回给列表.从LINQ到XML
本文关键字:列表 LINQ XML 返回 元素 属性 | 更新日期: 2023-09-27 18:03:49
我有一个类似于下面的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]"拉字符串。这将在第7行给出第四个some值。
根据您的评论更新
"我想要的是能够做一些类似于这个"testmultilist[0][2]"的事情,这将返回一些从第一排,虽然我不确定我这样做是对的。"
你还是很接近的,除了你选择了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();
}
}
}