У меня есть следующий класс.Пользовательская 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();
}
Все еще ищет лучшее решение ...
Как сделать что-то подобное http://stackoverflow.com/a/1012422/299327? –
Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –