使用Xdocument读取XML

时间:2012-08-06 18:12:06

标签: c# xml linq

我的课程:

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

我怎么读“功能”???

1 个答案:

答案 0 :(得分:7)

再次做同样的事情,使用ElementsSelect将一组元素投影到对象。

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

为清楚起见,我实际建议在FromXElementDevice中分别编写静态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私有,所以它们可以是公共不可变的(在集合周围做一些努力)。