using System.Collections.Generic;
using System.Xml.Serialization;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Globalization;
using System.ComponentModel.DataAnnotations;
using System.Collections;
[XmlRoot("InterestRates")]
public class InterestRates
[XmlElement("InterestRates_A")]
public InterestRates_A InterestRates_A { get; set; }
[XmlElement("InterestRates_B")]
public InterestRates_B InterestRates_B { get; set; }
[XmlElement("InterestRates_C")]
public InterestRates_C InterestRates_C { get; set; }
[XmlElement("InterestRates_D")]
public InterestRates_D InterestRates_D { get; set; }
[XmlElement("InterestRates_E")]
public InterestRates_E InterestRates_E { get; set; }
[XmlElement("InterestRates_F")]
public InterestRates_F InterestRates_F { get; set; }
[XmlType("InterestRates_A")]
public class InterestRates_A
[XmlElement("InterestRate_A")]
public InterestRate_A[] InterestRate_A { get; set; }
[XmlType("InterestRates_B")]
public class InterestRates_B
[XmlElement("InterestRate_B")]
public InterestRate_B[] InterestRate_B { get; set; }
[XmlType("InterestRates_C")]
public class InterestRates_C
[XmlElement("InterestRate_C")]
public InterestRate_C[] InterestRate_C { get; set; }
[XmlType("InterestRates_D")]
public class InterestRates_D
[XmlElement("InterestRate_D")]
public InterestRate_D[] InterestRate_D { get; set; }
[XmlType("InterestRates_E")]
public class InterestRates_E
[XmlElement("InterestRate_E")]
public InterestRate_E[] InterestRate_E { get; set; }
[XmlType("InterestRates_F")]
public class InterestRates_F
[XmlElement("InterestRate_F")]
public InterestRate_F[] InterestRate_F { get; set; }
public class InterestRate_A
[XmlElement("ValidFrom")]
public string ValidFrom { get; set; }
public string ValidTo { get; set; }
public string Rate { get; set; }
public class InterestRate_B
[XmlElement("ValidFrom")]
public string ValidFrom { get; set; }
public string ValidTo { get; set; }
public string Rate { get; set; }
public string Rate2 { get; set; }
public class InterestRate_C
[XmlElement("ValidFrom")]
public string ValidFrom { get; set; }
public string ValidTo { get; set; }
public string Rate { get; set; }
public class InterestRate_D
[XmlElement("ValidFrom")]
public string ValidFrom { get; set; }
public string ValidTo { get; set; }
public string Rate { get; set; }
public class InterestRate_E
[XmlElement("ValidFrom")]
public string ValidFrom { get; set; }
public string ValidTo { get; set; }
public string Rate { get; set; }
public class InterestRate_F
[XmlElement("ValidFrom")]
public string ValidFrom { get; set; }
public string ValidTo { get; set; }
public string Rate { get; set; }
var xml = @"<InterestRates>
<ValidTo>2004-12-31</ValidTo>
<ValidFrom>2005-01-01</ValidFrom>
<ValidTo>2005-12-31</ValidTo>
<ValidFrom>2005-01-01</ValidFrom>
<ValidTo>2005-12-31</ValidTo>
<ValidFrom>2006-01-01</ValidFrom>
<ValidTo>2006-12-31</ValidTo>
<ValidFrom>2007-01-01</ValidFrom>
<ValidTo>2009-10-30</ValidTo>
<ValidFrom>2009-10-31</ValidFrom>
<ValidTo>2009-10-30</ValidTo>
<ValidFrom>2016-05-01</ValidFrom>
<ValidFrom>2017-01-01</ValidFrom>
<ValidFrom>2017-01-01</ValidFrom>
<ValidFrom>2017-01-01</ValidFrom>
<ValidFrom>2017-01-01</ValidFrom>
public static void Main()
var rates = xml.LoadFromXml<InterestRates>();
var xml2 = rates.GetXml(true);
Console.WriteLine("Deserialized and re-serialied XML: ");
if (XElement.Parse(xml).DescendantsAndSelf().Count() != XElement.Parse(xml).DescendantsAndSelf().Count())
throw new InvalidOperationException("XElement.Parse(xml).DescendantsAndSelf().Count() != XElement.Parse(xml).DescendantsAndSelf().Count()");
Console.WriteLine("Serialized and re-serialized XML look equivalent.");
public static class XmlSerializationHelper
public static T LoadFromXml<T>(this string xmlString)
using (StringReader reader = new StringReader(xmlString))
return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
public static string GetXml<T>(this T obj, 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))
new XmlSerializer(obj.GetType()).Serialize(xmlWriter, obj, ns);
return textWriter.ToString();