Generate object from xml in c#

Assume that you have an xml file including several levels of data and you want to read this xml file into in-memory objects in c# programming language.
Check the contents of xml file given below:
<?xml version="1.0" encoding="UTF-8"?>
<customers>
  <customer>
    <name>Name1</name>
    <surname>Surname1</surname>
  </customer>
  <customer>
    <name>Name2</name>
    <age>Age2</age>
  </customer>
</customers>
Creating C# class file from XML file
You can create a C# class file using xsd command through Developer Command Prompt as given below:
xsd test.xml // will create test.xsd file
xsd test.xsd /classes // will create test.cs file
Loading XML data into C# objects
Then, add test.cs file to your project and use it to load the xml file as given below:
XmlSerializer ser = new XmlSerializer(typeof(customers));
string filename = "test.xml";
var fstream = new FileStream(filename, FileMode.Open);
customers data = ser.Deserialize(fstream) as customers;
if (data != null)
{
    // use your data
}
Note that, there are also several 3rd party tools that are able to create c# class files from given xml files.
Solution 2: Json to create dynamic objects from xml files
XDocument doc = XDocument.Parse(xmlData); // or XDocument.Load(path)
string jsonText = JsonConvert.SerializeXNode(doc);
dynamic dyn = JsonConvert.DeserializeObject<ExpandoObject>(jsonText);
Solution 3: Parsing XML files into dynamic objects in C#
Here is another alternative solution that can be used for parsing xml files to dynamic objects in c#.
public class XmlToDynamic
{
    public static void Parse(dynamic parent, XElement node)
    {
        if (node.HasElements)
        {
            if (node.Elements(node.Elements().First().Name.LocalName).Count() > 1)
            {
                var item = new ExpandoObject();
                var list = new List<dynamic>();
                foreach (var element in node.Elements())
                {                        
                    Parse(list, element);                        
                }
                AddProperty(item, node.Elements().First().Name.LocalName, list);
                AddProperty(parent, node.Name.ToString(), item);
            }
            else
            {
                var item = new ExpandoObject();
                foreach (var attribute in node.Attributes())
                {
                    AddProperty(item, attribute.Name.ToString(), attribute.Value.Trim());
                }
                foreach (var element in node.Elements())
                {
                    Parse(item, element);
                }
                AddProperty(parent, node.Name.ToString(), item);
            }
        }
        else
        {
            AddProperty(parent, node.Name.ToString(), node.Value.Trim());
        }
    }
    private static void AddProperty(dynamic parent, string name, object value)
    {
        if (parent is List<dynamic>)
        {
            (parent as List<dynamic>).Add(value);
        }
        else
        {
            (parent as IDictionary<String, object>)[name] = value;
        }
    }
}