2013-02-16 90 views
6

我有一个XMLDocument,我需要阅读和转换成一组对象。我有以下对象将此XML文档转换为我的对象的最简单方法是什么?

public class Location 
{ 
     public string Name; 
     public List<Building> Buildings; 
} 

public class Building 
{ 
    public string Name; 
    public List<Room> Rooms; 
} 

和我有下面的XML文件:

<?xml version="1.0" encoding="utf-8" ?> 
<info> 
<locations> 
    <location name="New York"> 
    <Building name="Building1"> 
    <Rooms> 
     <Room name="Room1"> 
     <Capacity>18</Capacity> 
     </Room> 
     <Room name="Room2"> 
     <Capacity>6</Capacity> 
     </Room> 
    </Rooms> 
    </Building> 

    <Building name="Building2"> 
    <Rooms> 
     <Room name="RoomA"> 
     <Capacity>18</Capacity> 
     </Room> 
    </Rooms> 
    </Building> 
</location> 
<location name ="London"> 
    <Building name="Building45"> 
    <Rooms> 
     <Room name="Room5"> 
     <Capacity>6</Capacity> 
     </Room> 
    </Building> 
</location> 
</locations> 
</info> 

什么是这样做的最佳方式?我是否应该自动序列化xmldocument到对象,还是需要解析出每个元素并手动转换为我的对象?特别是,我想弄清楚如何转换集合(地点,建筑物等)。

什么是这个XML文件转换成基本上是

List<Location> 

对象的最好的建议?

回答

11

因为在例子中,你表现出你有未关闭的标签你可以通过固定的XML开始。您也可以将<Building>标签包装到<Buildings>集合中,以便能够在建筑物之外的此“位置”类中使用其他属性。

<?xml version="1.0" encoding="utf-8" ?> 
<info> 
    <locations> 
    <location name="New York"> 
     <Buildings> 
     <Building name="Building1"> 
      <Rooms> 
      <Room name="Room1"> 
       <Capacity>18</Capacity> 
      </Room> 
      <Room name="Room2"> 
       <Capacity>6</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 

     <Building name="Building2"> 
      <Rooms> 
      <Room name="RoomA"> 
       <Capacity>18</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 
     </Buildings> 
    </location> 
    <location name="London"> 
     <Buildings> 
     <Building name="Building45"> 
      <Rooms> 
      <Room name="Room5"> 
       <Capacity>6</Capacity> 
      </Room> 
      </Rooms> 
     </Building> 
     </Buildings> 
    </location> 
    </locations> 
</info> 

修复了XML之后,您可以调整模型。我会在你的类中使用属​​性,而不是字段建议你:

public class Location 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    public List<Building> Buildings { get; set; } 
} 

public class Building 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    public List<Room> Rooms { get; set; } 
} 

public class Room 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 
    public int Capacity { get; set; } 
} 

[XmlRoot("info")] 
public class Info 
{ 
    [XmlArray("locations")] 
    [XmlArrayItem("location")] 
    public List<Location> Locations { get; set; } 
} 

现在所有剩下的就是反序列化的XML:

var serializer = new XmlSerializer(typeof(Info)); 
using (var reader = XmlReader.Create("locations.xml")) 
{ 
    Info info = (Info)serializer.Deserialize(reader); 
    List<Location> locations = info.Locations; 
    // do whatever you wanted to do with those locations 
} 
6

只需使用XML序列化属性 - 例如:

public class Location 
{ 
     [XmlAttribute("name"); 
     public string Name; 
     public List<Building> Buildings; 
} 

public class Building 
{ 
    [XmlAttribute("name"); 
    public string Name; 
    public List<Room> Rooms; 
} 

,只需记住 - 一切都将被默认序列化为XML元素 - 与萨姆斯一样的对象的名称:)

这样做是为了负载:

using(var stream = File.OpenRead("somefile.xml")) 
{ 
    var serializer = new XmlSerializer(typeof(List<Location>)); 
    var locations = (List<Location>)serializer.Deserialize(stream); 
} 
相关问题