I have the following class.
public class ConfigurationItem { public String Type { get; set; } public String Value { get; set; } }
This code performs serialization.
static void Main(string[] args) { List<ConfigurationItem> cis = new List<ConfigurationItem>(); cis.Add(new ConfigurationItem() { Type = "Car", Value = "Car Value" }); cis.Add(new ConfigurationItem() { Type = "Bike", Value = "Bike Value" }); System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(cis.GetType()); x.Serialize(Console.Out, cis); }
Actual yield below.
<?xml version="1.0" encoding="IBM437"?> <ArrayOfConfigurationItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ConfigurationItem> <Type>Car</Type> <Value>Car Value</Value> </ConfigurationItem> <ConfigurationItem> <Type>Bike</Type> <Value>Bike Value</Value> </ConfigurationItem> </ArrayOfConfigurationItem>
I would like to create the following XML.
<?xml version="1.0" encoding="IBM437"?> <ArrayOfConfigurationItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ConfigurationItem> <Type>Car</Type> <Value Label="Car Label">Car Value</Value> </ConfigurationItem> <ConfigurationItem> <Type>Bike</Type> <Value Label="Bike Label">Bike Value</Value> </ConfigurationItem> </ArrayOfConfigurationItem>
I have the following type for a label mapping table
Dictionary<String, String> ValueLabels = new Dictionary<string, string>() { {"Car","Car Label"}, {"Bike","Bike Label"} };
I cannot touch the ConfigurationItem class. Is it possible to use System.Xml.Serialization.XmlAttributeOverrides or something like that?
Edit 1 I have an ugly solution that I am using now. I use regular serialization and adding data to XmlDocument manually.
static void Main(string[] args) { List<ConfigurationItem> cis = new List<ConfigurationItem>(); cis.Add(new ConfigurationItem(){Type = "Car", Value = "Car Value"}); cis.Add(new ConfigurationItem(){Type = "Bike", Value = "Bike Value"}); Dictionary<String, String> valueLabels = new Dictionary<string, string>() { {"Car","Car Label"}, {"Bike","Bike Label"} }; var detailDocument = new System.Xml.XmlDocument(); var nav = detailDocument.CreateNavigator(); if (nav != null) { using (System.Xml.XmlWriter w = nav.AppendChild()) { var ser = new System.Xml.Serialization.XmlSerializer(cis.GetType()); ser.Serialize(w, cis); } } var nodeList = detailDocument.DocumentElement.SelectNodes("//ConfigurationItem"); foreach (System.Xml.XmlNode node in nodeList) { String type = ((System.Xml.XmlElement)node.SelectNodes("Type")[0]).InnerText; ((System.Xml.XmlElement)node.SelectNodes("Value")[0]).SetAttribute("Label", valueLabels[type]); } System.Xml.XmlTextWriter writer = new System.Xml.XmlTextWriter(Console.Out); writer.Formatting = System.Xml.Formatting.Indented; detailDocument.WriteTo(writer); Console.ReadLine(); }
We are looking for the best solution ...