Auto generating Entity classes with xsd.exe for XML Serialization and De-Serialization
Introduction
Many time we come across the need of parsing XML document and creating entities. These entities are later passed between multiple methods, stored as configuration or used to perform some manipulation. Hand wrting code for parsing these entities from XML document is tedious. This article presents and easy way to parse XML documents and generating deserializers.
Hands on!
Lets create a sample XML document named Students.xml following is the sample content.
<xml version="1.0" encoding="utf-8" ?><Students> <Student> <RollNo>1</RollNo> <Name>Student 1</Name> <Address>Xyz Street</Address> </Student> <Student> <RollNo>2</RollNo> <Name>Student 2</Name> <Address>Xyz Street</Address> </Student> <Student> <RollNo>3</RollNo> <Name>Student 3</Name> <Address>Xyz Street</Address> </Student> <Student> <RollNo>4</RollNo> <Name>Student 4</Name> <Address>Xyz Street</Address> </Student> <Student> <RollNo>5</RollNo> <Name>Student 5</Name> <Address>Xyz Street</Address> </Student></Students>
Here, as we can see, there is one root node named <Students> and it contains <Student> nodes as children. Now, what if we need to create a list of students in our program and bind it to some grid? We have to write manual parsing code for achieving same. But, you can easily achieve this task using xsd.exe to generate de-serializer and get the student collection. Following are the steps
Start Visual Studio and open Student.xml
Click on "XML" -> "Create Schema" on toolbar
It will generate XML Schema. Following is the sample schema generated for Students.xml file
<?xml version="1.0" encoding="utf-8"?><xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="https://www.w3.org/2001/XMLSchema"> <xs:element name="Students"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Student"> <xs:complexType> <xs:sequence> <xs:element name="RollNo" type="xs:unsignedByte" /> <xs:element name="Name" type="xs:string" /> <xs:element name="Address" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element></xs:schema>
Here we can observe the datatypes are automatically set as per the data available in Student.xml As per your need you can edit the schema and set the appropriate data types.
Save the Students.xml and Students.xsd files inside some folder say "C:\Sample\XML"
Now, we have to start "Visual Studio Command Prompt"
On VS Command Prompt, cd to "C:\Sample\XML" directory and type "xsd Students.xsd /c"
This will generate "Students.cs" file that we can use to de-serialize Student.xml file
Now create a "Console Application" named "XmlDeSerializer" we will use this to test the de-serialization
Add "Students.cs" file that we have created using xsd.exe file
Copy and paste following code in Program.cs file and run the program.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.IO; using System.Xml.Serialization; namespace XmlDeSerializer { class Program { static void Main(string[] args) { using (FileStream xmlStream = new FileStream("C:\\Sample\\XML\\Students.xml", FileMode.Open)) { using (XmlReader xmlReader = XmlReader.Create(xmlStream)) { XmlSerializer serializer = new XmlSerializer(typeof(Students)); Students deserializedStudents = serializer.Deserialize(xmlReader) as Students; foreach (var student in deserializedStudents.Student) { Console.WriteLine("Roll No : {0}", student.RollNo); Console.WriteLine("Name : {0}", student.Name); Console.WriteLine("Address : {0}", student.Address); Console.WriteLine(""); } } } } } }
You will see following output
In this way we have successfully de-serialized Students.xml file and created entities. You May also serialize existing entites back in the xml format, we can use "Serialize" method of XmlSerializer.
I Hope this helps.