添加额外属性的自定义XML序列化

问题描述:

我有以下类。添加额外属性的自定义XML序列化

public class ConfigurationItem 
{ 
    public String Type { get; set; } 
    public String Value { get; set; } 
} 

该代码执行序列化。

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); 
} 

实际输出如下。

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

我想制作下面的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> 

我有以下类型标签可用

Dictionary<String, String> ValueLabels = new Dictionary<string, string>() 
{ 
    {"Car","Car Label"}, 
    {"Bike","Bike Label"} 
}; 

我不能碰形态项目类映射表。有没有可能使用System.Xml.Serialization.XmlAttributeOverrides或类似的东西?

编辑1 我有一个丑陋的解决方案,我现在正在使用。我正在使用正常序列化并手动添加数据到XmlDocument。

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(); 
} 

还在寻找更好的解决办法...

+0

怎么样做这样的事情http://*.com/a/1012422/299327? – 2013-06-13 19:16:32

+0

我编辑过你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2013-06-13 19:26:22

如果你想输出的属性,你需要将被序列化为属性的属性。请尝试以下操作:

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

感谢您的回答。唯一的问题是我无法触摸ConfigurationItem类并在其中添加额外的属性。 – ahagman 2013-06-17 19:24:31

+0

在这种情况下,你几乎不走运,除非你为自己创建了一个单独的类,仅用于序列化。 – 2013-06-18 06:57:39