Custom XML serialization adding additional attributes

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

+4
source share
1 answer

If you want to output an attribute, you will need a property that will be serialized as an attribute. Try the following:

 public class ConfigurationItem { public String Type { get; set; } public String Value { get; set; } [XmlAttribute("Label")] public string Label { get {return Value;} set {Value = value;} } } 
+2
source

All Articles