Reader Level:
ARTICLE

Creating and Saving XML Tree Using LINQ to XML

Posted by Dhananjay Kumar Articles | LINQ July 30, 2009
This article explains how to create a XML Tree using LINQ. This will explain the Functional Construction way to create a XML tree.
  • 1
  • 0
  • 50177
Download Files:
 


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

  1. This class represents XML elements.
  2. This class is inside the namespace System.Xml.Linq.
  3. This class is used to construct XML.
  4. This class takes various types of arguments for content.
  5. This is extended from the XContainer class and the XContainer class is extended from the XNode class.
  6. Some method of this class could be used from the XAML.

Content of XElement class
  1. A string, that is added as text content. This is the recommended pattern to add a string as the value of an element.
  2. An XText, that can have either a string or CData value, added as child content.
  3. A XElement, that is added as a child element.
  4. A XAttribute, that is added as an attribute.
  5. An XProcessingInstruction or XComment, that is added as child content.
  6. An IEnumerable, that is enumerated, and these rules are applied recursively.
  7. Anything else, ToString() is called and the result is added as text content.
  8. 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

1.gif

Sample 2: Constructing XML Tree from an Array (List) of class.

In this sample I will:
  1. Create a class called Author
  2. Create a list of Author.
  3. 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

2.gif

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.

3.gif

Drag a table by choosing Server Explorer option. I am dragging a WCF table here.

4.gif

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:

5.gif

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:

6.gif

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.

COMMENT USING

Trending up