添加额外属性的自定义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();
}
还在寻找更好的解决办法...
答
如果你想输出的属性,你需要将被序列化为属性的属性。请尝试以下操作:
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
怎么样做这样的事情http://stackoverflow.com/a/1012422/299327? – 2013-06-13 19:16:32
我编辑过你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 – 2013-06-13 19:26:22