我有一个IEnumerable<Item>
,其中Item有一个名为“widgets”的属性,其中包含xml作为字符串。 xml包含每个窗口小部件的元素,每个窗口小部件可以包含名为“foo”的可选元素。例如:
<widgets>
<widget code="A">
<foo>1</foo>
</widget>
<widget code="B" />
</widgets>
我可以将IEnumerable<Item>
展平为代表小部件的匿名类型的IEnumerable吗?
答案 0 :(得分:1)
我不确定foo
是否可以重复元素,但在这种情况下它会以Enumerable<String>
的形式返回,这很容易改变。
设置(这里有两个项目,使用相同的Widgets
XML):
public class Item
{
public string Name;
public string Widgets;
}
var xml = "<widgets>\r\n <widget code=\"A\">\r\n <foo>1</foo>\r\n </widget>\r\n <widge" +
"t code=\"B\" />\r\n</widgets>";
var item1 = new Item {Name = "I1", Widgets = xml};
var item2 = new Item {Name = "I2", Widgets = xml};
var items = new Item[] {item1, item2}.AsEnumerable();
小部件选择过程:
var widgets =
from item in items
from widget in XElement.Parse(item.Widgets).Elements("widget")
select new {
Name = item.Name,
Code = widget.Attribute("code").Value,
Foo = widget.Elements("foo").Select(f => f.Value)
};
它为您提供了4个项目(I1 A,I1 B,I2 A,I2 B),其名称(来自项目)和Code和Foo(来自XML)设置正确。
如果您希望foo
成为单个元素,则更改如下(基本上设置FirstOrDefault
),这将为foo
不在的时间提供空值:< / p>
var widgets =
from item in items
from widget in XElement.Parse(item.Widgets).Elements("widget")
select new {
Name = item.Name,
Code = widget.Attribute("code").Value,
Foo = widget.Elements("foo").Select(f => f.Value).FirstOrDefault()
};