Objective:
This article is going to explain, How to create XML Tree using LINQ? This will be explaining Functional Construction way of creating XML tree. There are three samples given in this article. One for basic XML tree construction, one to construct from array of objects and last to construct XML tree from content of a DB table.
Functional Construction
LINQ to XML provides a powerful way to construct XML tree, and this way is called Functional Construction. Functional Construction is the ability to create XML tree in one line of code. Various classes to be used from LINQ to XML programming interface to enable functional construction. XElement is most important among them.
XElement class
- This class represents XML element.
- This class is inside the namespace System.Xml.Linq
- This class is used to construct XML.
- This class takes various types of arguments for content.
- This is extended from XContainer class and XContainer class is extended from XNode class.
- Some method of this class could be used from the XAML.
Content of XElement class
- A string, which is added as text content. This is the recommended pattern to add a string as the value of an element.
- An XText, which can have either a string or CData value, added as child content.
- A XElement, which is added as a child element.
- A XAttribute, which is added as an attribute.
- An XProcessingInstruction or XComment, which is added as child content.
- An IEnumerable, which is enumerated, and these rules are applied recursively.
- Anything else, ToString() is called and the result is added as text content.
- Null, which is ignored.
Sample 1 : Creating simple XML Tree with hard coded value
In below sample, we are creating a simple XML. Elements are as Data1, Data2 and so on. Data1 element is having a property called name with the value Dj. We are using XElement and XAttribute classes from LINQ to XML API to achieve this task.
XElement xmltree = new
XElement(“Root”,
new
XElement(“Data1”,new
XAttribute(“name”,“Dj”),1),
new
XElement(“Data2”,
new
XElement(“Data2A”,“2a”)),
new
XElement(“Data3”, “3”),
new
XElement (“Data4”,“4”)
);
Console.WriteLine(xmltree);
Console.ReadKey(true);
Output
Sample 2: Constructing XML Tree from Array (List) of class.
In this sample
- I will create a class called Author
- I will create a list of Author.
- I will construct XML from that List of class.
Creating a Author class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinqtoXMLSample1
{
public
class
Author
{
public
string Name { get; set; }
public
int NumberofArticles { get; set; }
}
}
Creating a static method to construct list of authors
static
List<Author> CreateAuthorList()
{
List<Author> list = new
List<Author>()
{
new
Author(){Name=“Dhananjay Kumar”,NumberofArticles= 60},
new
Author (){Name =” Rekha Singh “, NumberofArticles =5},
new
Author () {Name = ” Deepti maya patra”,NumberofArticles =55},
new
Author (){Name=” Mahesh Chand”,NumberofArticles = 700},
new
Author (){Name =” Mike Gold”,NumberofArticles = 300},
new
Author(){Name =“Praveen Masood”,NumberofArticles = 200},
new
Author (){Name =“Shiv Prasad Koirala”,NumberofArticles=100},
new
Author (){Name =” Mamata M “,NumberofArticles =50},
new
Author (){Name=” Puren Mehara”,NumberofArticles =50}
};
return list;
}
Constructing XML from List
XElement xmlfromlist = new
XElement(“Authors”,
from a in list
select
new
XElement(“Author”,
new
XElement(“Name”, a.Name),
new
XElement(“NumberOfArticles”, a.NumberofArticles)));
In above code , I am simple enumerating through the list and adding Element in XML.
Putting all together
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Xml.Linq;
namespace LinqtoXMLSample1
{
class
Program
{
static
void Main(string[] args)
{
List<Author> list = CreateAuthorList();
XElement xmlfromlist = new
XElement(“Authors”,
from a in list
select
new
XElement(“Author”,
new
XElement(“Name”, a.Name),
new
XElement(“NumberOfArticles”, a.NumberofArticles)));
Console.WriteLine(xmlfromlist);
Console.ReadKey(true);
}
static
List<Author> CreateAuthorList()
{
List<Author> list = new
List<Author>()
{
new
Author(){Name=“Dhananjay Kumar”,NumberofArticles= 60},
new
Author (){Name =” Rekha Singh “, NumberofArticles =5},
new
Author () {Name = ” Deepti maya patra”,NumberofArticles =55},
new
Author (){Name=” Mahesh Chand”,NumberofArticles = 700},
new
Author (){Name =” Mike Gold”,NumberofArticles = 300},
new
Author(){Name =“Praveen Masood”,NumberofArticles = 200},
new
Author (){Name =“Shiv Prasad Koirala”,NumberofArticles=100},
new
Author (){Name =” Mamata M “,NumberofArticles =50},
new
Author (){Name=” Puren Mehara”,NumberofArticles =50}
};
return list;
}
class
Author
{
public
string Name { get; set; }
public
int NumberofArticles { get; set; }
}
}
}
Output
Sample 3: Constructing XML Tree from a DB Table.
In this sample, I will create XML tree from content of a table. I do have a table in my Data Base.
Creating LINQ to SQL Class
Right click and add a LINQ to SQL class.
Drag a table by choosing Server Explorer option. I am dragging WCF table here.
Fetching all the records
var res = from r in context.WCFs select r;
Constructing XML from list
XElement xmlfromdb = new
XElement(“Employee”,
from a in res
select
new
XElement(“EMP”,
new
XElement(“EmpId”, a.EmpId),
new
XElement(“Name”, a.Name)));
Putting all together
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Xml.Linq;
namespace LinqtoXMLSample1
{
class
Program
{
static
void Main(string[] args)
{
DataClasses1DataContext context = new
DataClasses1DataContext();
var res = from r in context.WCFs select r;
foreach (WCF r in res)
{
Console.WriteLine(r.Name);
}
XElement xmlfromdb = new
XElement(“Employee”,
from a in res
select
new
XElement(“EMP”,
new
XElement(“EmpId”, a.EmpId),
new
XElement(“Name”, a.Name)));
Console.WriteLine(xmlfromdb);
Console.ReadKey(true);
}
Output:
Saving XML Tree in a XML file
So far in all above sample, I am just displaying the XML tree on the console. What if? We want to save them on hard disk. To do that, just call Save () method on instance on XElement.
So to save the XML tree in a XML file in Sample 3, just we need to call Save method as below. XML Tree will get saved in a.xml at location E local drive.
xmlfromdb.Save(@”e:\\a.xml”);
Console.WriteLine(“File Saved”);
a.xml will contain something like below,
Conclusion:
In this article, I have talked about various way of creating XML tree using LINQ. Please find the attached code for better understanding. Thanks for reading.
Happy Coding
Leave a Reply