using System.Collections.Generic;
using System.Xml.Serialization;
[XmlRoot(ElementName="header")]
[XmlElement(ElementName="from_application_id")]
public Guid From_application_id { get; set; }
[XmlElement(ElementName="to_application_id")]
public Guid To_application_id { get; set; }
[XmlRoot(ElementName="client")]
[XmlElement(ElementName="first_name")]
public string First_name { get; set; }
[XmlElement(ElementName="last_name")]
public string Last_name { get; set; }
[XmlAttribute(AttributeName="client_id")]
public string Client_id { get; set; }
[XmlRoot(ElementName="patient_weight")]
public class Patient_weight {
[XmlElement(ElementName="weight")]
public decimal Weight { get; set; }
[XmlAttribute(AttributeName="patient_weight_uom")]
public string Patient_weight_uom { get; set; }
[XmlRoot(ElementName="patient")]
[XmlElement(ElementName="patient_name")]
public string Patient_name { get; set; }
[XmlElement(ElementName="patient_breed")]
public string Patient_breed { get; set; }
[XmlElement(ElementName="patient_birth_dt")]
public string Patient_birth_dt { get; set; }
[XmlElement(ElementName="patient_weight")]
public Patient_weight Patient_weight { get; set; }
[XmlAttribute(AttributeName="patient_id")]
public string Patient_id { get; set; }
[XmlAttribute(AttributeName="patient_species")]
public string Patient_species { get; set; }
[XmlAttribute(AttributeName="patient_gender")]
public string Patient_gender { get; set; }
[XmlRoot(ElementName="doctor")]
[XmlElement(ElementName="first_name")]
public string First_name { get; set; }
[XmlElement(ElementName="last_name")]
public string Last_name { get; set; }
[XmlRoot(ElementName="work_request")]
public class Work_request {
[XmlElement(ElementName="client")]
public Client Client { get; set; }
[XmlElement(ElementName="patient")]
public Patient Patient { get; set; }
[XmlElement(ElementName="doctor")]
public Doctor Doctor { get; set; }
[XmlArray(ElementName="service_add")]
[XmlArrayItem("service_cd")]
public List<string> Service_add { get; set; }
[XmlAttribute(AttributeName="requisition_number")]
public string Requisition_number { get; set; }
[XmlRoot(ElementName="body")]
public class WorkRequestBody
[XmlElement(ElementName="work_request")]
public Work_request Work_request { get; set; }
[XmlRoot(ElementName="message")]
public class Message<T> where T : class, new()
[XmlElement(ElementName="header")]
public Header Header { get; set; }
[XmlElement(ElementName="body")]
public T Body { get; set; }
[XmlAttribute(AttributeName="message_id")]
public string Message_id { get; set; }
[XmlAttribute(AttributeName="message_dt")]
public string Message_dt { get; set; }
[XmlAttribute(AttributeName="message_type")]
public string Message_type { get; set; }
[XmlAttribute(AttributeName="message_sub_type")]
public string Message_sub_type { get; set; }
[XmlAttribute(AttributeName="message_dtd_version_number")]
public string Message_dtd_version_number { get; set; }
var xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<!DOCTYPE message SYSTEM ""work_request_20.dtd"">
<message message_id=""1005"" message_dt=""01/21/2008 09:50:23.221 AM"" message_type=""Work_Request"" message_sub_type=""New"" message_dtd_version_number=""2.0"">
<from_application_id>3367e115-c873-4ac9-a1dd-7e45231dc3d5</from_application_id>
<to_application_id>35e0cca2-e423-4ffe-ba07-7d056775c228</to_application_id>
<work_request requisition_number=""REQ44"">
<client client_id=""44"">
<first_name>Barak</first_name>
<last_name>Obama</last_name>
<patient patient_id=""4444"" patient_species=""CANINE"" patient_gender=""MALE_INTACT"">
<patient_name>Bo</patient_name>
<patient_breed>Portuguese Water Dog</patient_breed>
<patient_birth_dt>04/04/2004</patient_birth_dt>
<patient_weight patient_weight_uom=""lbs"">
<first_name>Surgeon</first_name>
<last_name>General</last_name>
<service_cd>ALB</service_cd>
<service_cd>GLU</service_cd>
<service_cd>BUN</service_cd>
public static void Main()
var originalXml = GetXml();
var message = originalXml.LoadFromXML<Message<WorkRequestBody>>();
var newXml = message.GetXml(true);
Console.WriteLine(newXml);
var elementOld = XElement.Parse(originalXml);
var elementNew = XElement.Parse(newXml);
if (!XNode.DeepEquals(elementOld, elementNew))
Console.WriteLine("Original and re-serialized ARE NOT equivalent.");
Console.WriteLine("Original and re-serialized ARE 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();