using System.Collections.Generic;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;
public interface IUnknownElementHandler
void OnUnknownElement(object sender, XmlElementEventArgs e);
public static partial class XmlSerializationHelper
public static T LoadFromXml<T>(this string xmlString, XmlSerializer serializer = null)
serializer = serializer ?? new XmlSerializer(typeof(T)).AddUnknownElementHandler();
using (var reader = new StringReader(xmlString))
return (T)serializer.Deserialize(reader);
public static T LoadFromFile<T>(string filename, XmlSerializer serializer = null)
serializer = serializer ?? new XmlSerializer(typeof(T)).AddUnknownElementHandler();
using (var reader = new FileStream(filename, FileMode.Open))
return (T)serializer.Deserialize(reader);
public static XmlSerializer AddUnknownElementHandler(this XmlSerializer serializer)
serializer.UnknownElement += (o, e) =>
var handler = e.ObjectBeingDeserialized as IUnknownElementHandler;
handler.OnUnknownElement(o, e);
public partial class ContainerType : IUnknownElementHandler
#region IUnknownElementHandler Members
void IUnknownElementHandler.OnUnknownElement(object sender, XmlElementEventArgs e)
var container = (ContainerType)e.ObjectBeingDeserialized;
var element1 = e.Element.SelectSingleNode("element1");
var element2 = e.Element.SelectSingleNode("element2");
if (element1 != null || element2 != null)
container.Objinfo = container.Objinfo ?? new Objinfo();
container.Objinfo.Element1 = element1.InnerText;
container.Objinfo.Element2 = element2.InnerText;
var element3 = e.Element.SelectSingleNode("element3");
var element4 = e.Element.SelectSingleNode("element4");
if (element3 != null || element4 != null)
container.Newobject = container.Newobject ?? new Newobject();
container.Newobject.Element3 = element3.InnerText;
container.Newobject.Element4 = element4.InnerText;
[XmlRoot(ElementName = "Root")]
public ContainerType ContainerType { get; set; }
[XmlRoot(ElementName = "ContainerType")]
public partial class ContainerType
[XmlElement(ElementName = "objinfo")]
public Objinfo Objinfo { get; set; }
[XmlElement(ElementName = "newobject")]
public Newobject Newobject { get; set; }
[XmlRoot(ElementName = "objinfo")]
[XmlElement(ElementName = "element1")]
public string Element1 { get; set; }
[XmlElement(ElementName = "element2")]
public string Element2 { get; set; }
[XmlRoot(ElementName = "newobject")]
[XmlElement(ElementName = "element3")]
public string Element3 { get; set; }
[XmlElement(ElementName = "element4")]
public string Element4 { get; set; }
public static void Test()
var filename = @"Question65397664.xml";
File.WriteAllText(filename, GetOldXml());
var root = XmlSerializationHelper.LoadFromFile<Root>(filename);
Console.WriteLine("Deserialized {0} and re-serialized with following XML:");
Console.WriteLine(root.GetXml());
static string GetOldXml()
return @"<Root><ContainerType><objectinfo>
<element1>old1</element1>
<element2>old2</element2>
<element3>old3</element3>
<element4>old4</element4>
</ContainerType></Root>";
public static partial class XmlSerializationHelper
public static string GetXml<T>(this T obj, XmlSerializer serializer = null, bool omitStandardNamespaces = false)
XmlSerializerNamespaces ns = null;
if (omitStandardNamespaces)
ns = new XmlSerializerNamespaces();
using (var textWriter = new StringWriter())
var settings = new XmlWriterSettings() { Indent = true };
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(xmlWriter, obj, ns);
return textWriter.ToString();
public static string GetOuterXml(this XmlNode node, bool indent = true)
using (var textWriter = new StringWriter())
var settings = new XmlWriterSettings
OmitXmlDeclaration = true,
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
return textWriter.ToString();
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.CodeBase.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];