如何在使用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集成。