Linq将具有xml属性的对象集合转换为表示xml元素的对象集合?

时间:2012-08-13 21:07:05

标签: c# linq linq-to-xml linq-to-objects

我有一个IEnumerable<Item>,其中Item有一个名为“widgets”的属性,其中包含xml作为字符串。 xml包含每个窗口小部件的元素,每个窗口小部件可以包含名为“foo”的可选元素。例如:

<widgets>
    <widget code="A">
        <foo>1</foo>
    </widget>
    <widget code="B" />
</widgets>

我可以将IEnumerable<Item>展平为代表小部件的匿名类型的IEnumerable吗?

1 个答案:

答案 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()
    };