What is the easiest way to convert this XML document to my object?

19,742

Solution 1

You could start by fixing your XML because in the example you have shown you have unclosed tags. You might also wrap the <Building> tags into a <Buildings> collection in order to be able 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 fixed your XML you could adapt your models. I would recommend you using 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 deserialize 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;
    // do whatever you wanted to do with those locations
}

Solution 2

Just use the XML serialization attributes- for example:

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

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

Just remember - everything will be serialized as XML Elements by default - with the sames the same as the names of the objects :)

Do this to load:

using(var stream = File.OpenRead("somefile.xml"))
{
   var serializer = new XmlSerializer(typeof(List<Location>));
   var locations = (List<Location>)serializer.Deserialize(stream );
}
Share:
19,742
leora
Author by

leora

Updated on June 04, 2022

Comments

  • leora
    leora almost 2 years

    I have an XMLDocument that i need to read in and convert into a set of objects. I have the following objects

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

    and i have the following XML file:

     <?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>
    

    What is the best way of doing this? Should I be serializing the xmldocument to the object automatically or do i need to parse out each element and convert into my object manually? In particular, I am trying to figure out how to convert the collections (locations, buildings, etc).

    What is the best suggestion to convert this XML file into basically a

    List<Location>
    

    objects?