我正在尝试使用公共类反序列化自定义配置键。反序列化的对象属性具有null值。有人可以指导我正确使用xml覆盖。
我已在此处粘贴代码,以便在控制台应用中尝试。
public class Program
{
private static void Main(string[] args)
{
var documentPropertyMapping =
GetCustomSectionSettingList<CustomSectionConfigElement>("abc/xyz",
"Activity", "value", "Function").ToDictionary(x => x.Key, x => x.Value);
}
private static List<T> GetCustomSectionSettingList<T>(string sectionName, string elementName, string keyAttributeName,
string valueAttributeName) where T : new()
{
var xml = @"<root><abc>
<xyz>
<Activity value = ""a Document"" Function = ""a Documentation"" />
<Activity value = ""b Document"" Function = ""a Documentation"" />
</xyz>
</abc></root>";
var settings = new List<T>();
var configDoc = XElement.Parse(xml);
var xOver = new XmlAttributeOverrides();
{
var attrs = new XmlAttributes();
var root = new XmlRootAttribute(elementName);
attrs.XmlRoot = root;
xOver.Add(typeof (T), attrs);
}
{
var attrs = new XmlAttributes();
var attribute = new XmlElementAttribute(keyAttributeName);
attrs.XmlElements.Add(attribute);
xOver.Add(typeof (T), "Key", attrs);
}
{
var attrs = new XmlAttributes();
var attribute = new XmlElementAttribute();
attribute.ElementName = valueAttributeName;
attrs.XmlElements.Add(attribute);
xOver.Add(typeof (T), "Value", attrs);
}
var serializer = new XmlSerializer(typeof (T), xOver);
foreach (var sectionXml in configDoc.XPathSelectElements(sectionName))
{
foreach (var elem in sectionXml.Elements())
settings.Add((T) serializer.Deserialize(elem.CreateReader()));
}
return settings;
}
#region custom section
public class CustomSectionConfigElement
{
public string Key { get; set; }
public string Value { get; set; }
}
#endregion custom section
}
答案 0 :(得分:1)
问题是您使用的是XmlElementAttribute
而不是XmlAttributeAttribute
。第一个意味着字段或属性被序列化为嵌套的XML 元素,第二个意味着封闭的XMl元素的属性。
因此覆盖应该如下所示:
{
var attrs = new XmlAttributes();
attrs.XmlAttribute = new XmlAttributeAttribute(keyAttributeName);
xOver.Add(typeof (T), "Key", attrs);
}
{
var attrs = new XmlAttributes();
attrs.XmlAttribute = new XmlAttributeAttribute(valueAttributeName);
xOver.Add(typeof (T), "Value", attrs);
}
请注意,您的原始代码适用于XML,如下所示:
<Activity>
<value>a Document</value>
<Function>a Documentation</Function>
</Activity>