You can start by fixing your XML, because in the example you showed you have private tags. You can also wrap <Building> tags in a <Building> collection to have other properties in this Location class other than 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>
Once you have corrected your XML, you could adapt your models. I would recommend you use properties instead of fields in your classes:
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; } }
and now all that's left is deserializing the 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;
source share