2012-08-13 86 views
0

我有一個IEnumerable<Item>其中Item有一個名爲「widgets」的屬性,其中包含xml作爲字符串。 xml包含每個小部件的元素,每個小部件可以包含一個名爲'foo'的可選元素。例如:Linq將具有xml屬性的對象集合轉換爲表示xml元素的對象集合?

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

我可以拼合IEnumerable<Item>成代表微件的匿名類型的IEnumerable?

+0

所以,你說獲取'IEnumerable '的每個元素,並返回一個新的'IEnumerable ',其中包含來自XML的所有''元素作爲不同的項目? – Tejs 2012-08-13 21:20:05

+0

是的,理想情況下,我還希望從項目上的屬性填充匿名類型的幾個屬性。 – adam0101 2012-08-13 21:26:49

+0

您是否在尋找類似於'select new {ItemName = item.Name,WidgetCodes = widgetCodesFromXml,Foos = foosFromXml}'的東西,其中Widget和Foos是IEnumerable 包含從Xml檢索的值,或者改爲'select new {ItemName = item.Name,WidgetXmlElements = widgetXmlElements}',其中WidgetXmlElements是IEnumerable 派生自小部件元素? – JamieSee 2012-08-13 21:59:52

回答

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乙,I2 A,I2 B)與名稱(來自Item)和Code和Foo(來自XML)正確設置。

如果你想foo是一個單一的元素,變化如下(設置FirstOrDefault基本),這將給你的空當foo不在身邊:

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