Objective:
This article explains how to create a XML Tree using LINQ. This will explain the Functional Construction way to create a XML tree. There are three samples given in this article. One for basic XML tree construction, one to construct from an array of objects and the last to construct the XML tree from the contents of a DB table.
Functional Construction
LINQ to XML provides a powerful way to construct XML trees and this way is called Functional Construction. Functional Construction is the ability to create a XML tree in one line of code. Various classes are to be used from a LINQ to XML programming interface to enable functional construction. XElement is most important among them.
XElement class
- This class represents XML elements.
- 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 the XContainer class and the XContainer class is extended from the XNode class.
- Some method of this class could be used from the XAML.
Content of XElement class
- A string, that is added as text content. This is the recommended pattern to add a string as the value of an element.
- An XText, that can have either a string or CData value, added as child content.
- A XElement, that is added as a child element.
- A XAttribute, that is added as an attribute.
- An XProcessingInstruction or XComment, that is added as child content.
- An IEnumerable, that 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 the following sample, we are creating a simple XML. Elements are as Data1, Data2 and so on. Data1 element has a property called name with the value Dj. We are using XElement and XAttribute classes from LINQ to XML API to do 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 an Array (List) of class.
In this sample I will:
- Create a class called Author
- Create a list of Author.
- Construct XML from that List of classes.
Creating an 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 the code above, I am simply enumerating through the list and adding elements to the XML.
Putting it 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 a XML tree from the contents of a table. I do have a table in my database.
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 a 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 it 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 the above samples, I am just displaying the XML tree on the console. What if we want to save them on the hard disk. To do that, just call the Save () method on the instance of an XElement.
So to save the XML tree in a XML file in Sample 3, we just need to call the Save method as below. The XML Tree will be saved in the file "a.xml" at a location in the local E drive.
xmlfromdb.Save(@"e:\\a.xml");
Console.WriteLine("File Saved");
a.xml will contain something as in the following:
Conclusion:
In this article I have talked about various ways of creating a XML tree using LINQ. Please find the attached code for a better understanding. Thanks for reading.
Happy Coding.