Search code examples
c#xmlxmlserializer

With XmlSerializer, how to set element names for a List?


I can't seem to get the XmlSerializer attributes to work. I have

public class DriveData
{
    public string Model { get; set; }
    public string Type { get; set; }
    public int SizeGB { get; set; }
    public string SerialNumber { get; set; }
    public bool IsOK { get; set; }
}
static List<DriveData> DiskDrives { get; set; }
XmlSerializer serializer = new XmlSerializer(typeof(List<DriveData>));
FileStream xmlFile = File.Create("DiskDrives.xml");
serializer.Serialize(xmlFile, DiskDrives);
xmlFile.Close();

What I want is:

<?xml version="1.0" encoding="utf-8" ?>
<HardDrives>
    <HardDrive>
        <Model>Seagate1</Model>
        ...
</HardDrive>
<HardDrive>
    ...
</HardDrive>

But what I'm getting is:

<?xml version="1.0"?>
<ArrayOfDriveData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DriveData>
    <Model>Seagate1</Model>
    <Type>SATA</Type>
    <SizeGB>999</SizeGB>
    ...
  </DriveData>
  <DriveData>
    ...
  </DriveData>
</ArrayOfDriveData>

[XmlElement(ElementName = "HardDrives")] on my List<DriveData> does nothing. [XmlElement(ElementName = "HardDrive")] on my DriveData class causes a build error. How do I set the root and the <HardDrive> elements names to what I want?


Solution

  • You can keep your model. Use XmlType attribute for the class and second argument as new XmlRootAttribute("HardDrives") while creating serializer object.

    [XmlType("HardDrive")]
    public class DriveData
    {
        public string Model { get; set; }
        public string Type { get; set; }
        public int SizeGB { get; set; }
        public string SerialNumber { get; set; }
        public bool IsOK { get; set; }
    }
    
    class Program
    {
        static List<DriveData> DiskDrives  { get; set; } = new List<DriveData>();
    
        static void Main(string[] args)
        {
            DiskDrives.Add(new DriveData { Model = "Seagate1", Type = "SATA", SizeGB = 999 });
            DiskDrives.Add(new DriveData { Model = "Seagate2", Type = "SATA", SizeGB = 777 });
    
            XmlSerializer serializer = new XmlSerializer(typeof(List<DriveData>), new XmlRootAttribute("HardDrives"));
            FileStream xmlFile = File.Create("DiskDrives.xml");
    
            serializer.Serialize(xmlFile, DiskDrives);
            xmlFile.Close();
    
            Console.Read();
        }      
    }