Search code examples
c#serializationxml-serializationxml-deserialization

Is it possible to deserialize XML into List<T>?


Given the following XML:

<?xml version="1.0"?>
<user_list>
   <user>
      <id>1</id>
      <name>Joe</name>
   </user>
   <user>
      <id>2</id>
      <name>John</name>
   </user>
</user_list>

And the following class:

public class User {
   [XmlElement("id")]
   public Int32 Id { get; set; }

   [XmlElement("name")]
   public String Name { get; set; }
}

Is it possible to use XmlSerializer to deserialize the xml into a List<User> ? If so, what type of additional attributes will I need to use, or what additional parameters do I need to use to construct the XmlSerializer instance?

An array ( User[] ) would be acceptable, if a bit less preferable.


Solution

  • You can encapsulate the list trivially:

    using System;
    using System.Collections.Generic;
    using System.Xml.Serialization;
    
    [XmlRoot("user_list")]
    public class UserList
    {
        public UserList() {Items = new List<User>();}
        [XmlElement("user")]
        public List<User> Items {get;set;}
    }
    public class User
    {
        [XmlElement("id")]
        public Int32 Id { get; set; }
    
        [XmlElement("name")]
        public String Name { get; set; }
    }
    
    static class Program
    {
        static void Main()
        {
            XmlSerializer ser= new XmlSerializer(typeof(UserList));
            UserList list = new UserList();
            list.Items.Add(new User { Id = 1, Name = "abc"});
            list.Items.Add(new User { Id = 2, Name = "def"});
            list.Items.Add(new User { Id = 3, Name = "ghi"});
            ser.Serialize(Console.Out, list);
        }
    }