CSharp · Console
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using System.Xml.Serialization;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.IO;
using System.Data;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;
//https://stackoverflow.com/questions/50304153/xmlserializer-to-c-sharp-object-store-original-xml-element#comment87633181_50304153
[XmlRoot(ElementName = "data")]
public class Data
{
[XmlAttribute(AttributeName = "someattributea")]
public string Someattributea { get; set; }
[XmlAttribute(AttributeName = "someattributeb")]
public string Someattributeb { get; set; }
[XmlAttribute(AttributeName = "someattributec")]
public string Someattributec { get; set; }
[XmlAnyAttribute]
public XmlAttribute[] Attributes { get; set; }
[XmlAnyElement]
[XmlText] // Captures mixed content at the root level as well as child elements.
public XmlNode[] ChildNodes { get; set; }
}
[XmlRoot("DataList")]
public class DataList
{
[XmlElement("DataItem", Namespace = "https://Test Namespace")]
public List<Data> Data { get; set; }
}
class TestClass
{
public static void Test()
{
var xml = GetXml();
var data = xml.LoadFromXml<Data>();
var xml2 = data.GetXml();
Console.WriteLine(xml2);
var data2 = xml2.LoadFromXml<Data>();
Assert.IsTrue(data.Someattributea == data2.Someattributea && data.Someattributeb == data2.Someattributeb && data.Someattributec == data2.Someattributec);
data2.Someattributea = "replacement value for Someattributea";
data2.Someattributeb = null;
var xml3 = data2.GetXml();
Console.WriteLine(xml3);
var data3 = xml3.LoadFromXml<Data>();
Assert.IsTrue(data3.Someattributea == data2.Someattributea && data3.Someattributeb == data2.Someattributeb && data3.Someattributec == data2.Someattributec);
Assert.IsTrue(XElement.Parse(xml3).Attributes().Select(a => a.Value).SequenceEqual(XElement.Parse(data3.GetXml()).Attributes().Select(a => a.Value)));
TestDatalist(data);
}
static void TestDatalist(Data data)
{
Console.WriteLine("\nTesting a list of {0}.", data);
var dataList = new DataList
{
Data = new List<Data>
{
data.GetXml().LoadFromXml<Data>(),
data.GetXml().LoadFromXml<Data>(),
},
};
var xml = dataList.GetXml();
Console.WriteLine(xml);
var dataList2 = xml.LoadFromXml<DataList>();
var xml2 = dataList2.GetXml();
Console.WriteLine(xml2);
Assert.IsTrue(dataList.Data.Count == dataList2.Data.Count);
}
static string GetXml()
{
var xml = @"<data someattributea="""" someattributeb="""" someattributec="""" ExtraAttr="""" xmlns:p1=""http://SomeTestNamespace.com"" p1:someattributec=""namespace attr"" />";
return xml;
}
}
public static class XmlSerializationHelper
{
public static T LoadFromXml<T>(this string xmlString, XmlSerializer serial = null)
{
serial = serial ?? new XmlSerializer(typeof(T));
using (var reader = new StringReader(xmlString))
{
return (T)serial.Deserialize(reader);
}
}
public static string GetXml<T>(this T obj, bool omitStandardNamespaces)
{
return obj.GetXml(null, omitStandardNamespaces);
}
public static string GetXml<T>(this T obj, XmlSerializer serializer = null, bool omitStandardNamespaces = false)
{
XmlSerializerNamespaces ns = null;
if (omitStandardNamespaces)
{
ns = new XmlSerializerNamespaces();
ns.Add("", ""); // Disable the xmlns:xsi and xmlns:xsd lines.
}
using (var textWriter = new StringWriter())
{
var settings = new XmlWriterSettings() { Indent = true }; // For cosmetic purposes.
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(xmlWriter, obj, ns);
return textWriter.ToString();
}
}
}
public class AssertionFailedException : System.Exception
{
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
}
public static class Assert
{
public static void IsTrue(bool value)
{
IsTrue(value, "failed");
}
public static void IsTrue(bool value, string message)
{
if (value == false)
throw new AssertionFailedException(message ?? "failed");
}
}
public class Program
{
public static void Main()
{
Console.WriteLine("Roslyn 2.0 Compiler; Environment version: " + Environment.Version);
Console.WriteLine();
try
{
TestClass.Test();
}
catch (Exception ex)
{
Console.WriteLine("Uncaught exception: ");
Console.WriteLine(ex);
throw;
}
}
}