2013-04-24 3 views
4

У меня есть следующий класс.Пользовательская 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"} 
}; 

Я не могу прикоснуться к классу ConfigurationItem. Можно ли использовать 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://stackoverflow.com/a/1012422/299327? –

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

2

Если вы хотите вывести атрибут, вам необходимо свойство, которое будет сериализовано в качестве атрибута. Попробуйте следующее:

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

+0

В этом случае вам не повезло, если вы не создали себе отдельный класс, просто для сериализации. –