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

后端 未结 2 1289
盖世英雄少女心
盖世英雄少女心 2021-01-05 15:49

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 Nam         


        
相关标签:
2条回答
  • 2021-01-05 16:39

    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
    }
    
    0 讨论(0)
  • 2021-01-05 16:46

    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 );
    }
    
    0 讨论(0)
提交回复
热议问题