如何在使用XmlSerializer保留内容的同时更改根元素名称?
我有一个XML文档:
Element 1 Element 2 Element 3
我需要反序列化为一个序列化为不同根名称的对象,其他所有内容保持不变。
例如:
Element 1 Element 2 Element 3
在序列化时,我们总是可以应用XmlRootAttribute
序列化到不同的根名称,但我不确定如何反序列化到不同的XmlRootAttribute
。 它error in document (1,2)
指向root属性的error in document (1,2)
保持失败error in document (1,2)
。
我怎样才能做到这一点?
XmlRootAttribute应该可行
[XmlRoot("dataNew")] public class MyData() { [XmlElement("elmt1")] public string myElement1{get;set;} [XmlElement("elmnt2")] public string myElement2{get;set;} [XmlElement("elmtn3")] public string myElement3{get;set;} }
编辑:完成XML
如果它只是您想要更改的根名称,则可以在声明XmlSerializer时指定root属性。
XmlSerializer xmlSerializer = new XmlSerializer(typeof(data), new XmlRootAttribute("dataNew"));
您是否尝试使用XmlAttributeOverrides类?
使用XmlAttributeOverrides的示例。 如果你投票,也给hjb417一个
class Program { static void Main(string[] args) { using (var fs = File.OpenRead("XmlFile1.xml")) using (var fs2 = File.OpenRead("XmlFile2.xml")) { var xSer = new XmlSerializer(typeof(data)); var obj = xSer.Deserialize(fs); // var xattribs = new XmlAttributes(); var xroot = new XmlRootAttribute("dataNew"); xattribs.XmlRoot = xroot; var xoverrides = new XmlAttributeOverrides(); xoverrides.Add(typeof(data), xattribs); var xSer2 = new XmlSerializer(typeof(data), xoverrides); var obj2 = xSer2.Deserialize(fs2); } } } public class data { public string elmt1 { get; set; } public string elmnt2 { get; set; } public string elmnt3 { get; set; } }
您可能必须实现ISerializable并更改GetObjectData ()中的根元素。
您可以使用ExtendedXmlSerializer 。 此序列化程序支持更改根元素名称和属性名称。 如果您有这样的课程:
[XmlRoot("dataNew")] public class Data { [XmlElement("elmt1")] public string Element1 { get; set; } [XmlElement("elmnt2")] public string Element2 { get; set; } [XmlElement("elmtn3")] public string Element3 { get; set; } }
你可以序列化它:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer(); var obj = new Data { Element1 = "A", Element2 = "B", Element3 = "C", }; var xml = serializer.Serialize(obj);
你的xml看起来像:
A B C
ExtendedXmlSerializer还有许多其他有用的function:
- 从标准XMLSerializer反序列化xml
- 带有属性接口的序列化类
- 序列化循环引用和引用ID
- 旧版xml的反序列化
- 属性加密
- 自定义序列化器
ExtendedXmlSerializer支持.net 4.5和.net Core。 您可以将它与WebApi和AspCore集成。