我不確定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()
};
所以,你說獲取'IEnumerable- '的每個元素,並返回一個新的'IEnumerable ',其中包含來自XML的所有'
'元素作爲不同的項目? –
Tejs
2012-08-13 21:20:05
是的,理想情況下,我還希望從項目上的屬性填充匿名類型的幾個屬性。 – adam0101 2012-08-13 21:26:49
您是否在尋找類似於'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