我的课程:
public class Device
{
int ID;
string Name;
List<Function> Functions;
}
和班级职能:
public class Function
{
int Number;
string Name;
}
我有这个结构的xml文件:
<Devices>
<Device Number="58" Name="Default Device" >
<Functions>
<Function Number="1" Name="Default func" />
<Function Number="2" Name="Default func2" />
<Function Number="..." Name="...." />
</Functions>
</Device>
</Devices>
这是代码,我正在尝试读取对象:
var list = from tmp in document.Element("Devices").Elements("Device")
select new Device()
{
ID = Convert.ToInt32(tmp.Attribute("Number").Value),
Name = tmp.Attribute("Name").Value,
//??????
};
DevicesList.AddRange(list);
我怎么读“功能”???
答案 0 :(得分:7)
再次做同样的事情,使用Elements
和Select
将一组元素投影到对象。
var list = document
.Descendants("Device")
.Select(x => new Device {
ID = (int) x.Attribute("Number"),
Name = (string) x.Attribute("Name"),
Functions = x.Element("Functions")
.Elements("Function")
.Select(f =>
new Function {
Number = (int) f.Attribute("Number"),
Name = (string) f.Attribute("Name")
}).ToList()
});
为清楚起见,我实际建议在FromXElement
和Device
中分别编写静态Function
方法。然后每一段代码都可以做一件事。例如,Device.FromXElement
可能如下所示:
public static Device FromXElement(XElement element)
{
return new Device
{
ID = (int) element.Attribute("Number"),
Name = (string) element.Attribute("Name"),
Functions = element.Element("Functions").Elements("Function")
.Select(Function.FromXElement)
.ToList();
};
}
这也允许你在类中使setter私有,所以它们可以是公共不可变的(在集合周围做一些努力)。