Introduction to LINQ to XML


This is a simple tutorial on LINQ to XML.

In this article I'm going to share about 
  1. How to add new node to Xml.
  2. To get all attribute values.
  3. To add attribute.
LINQ to XML provides an in memory xml programming Interface. It allows writing query expressions over XML, also uses very simple model for constructing XML documents.

The goal of LINQ to XML API is to provide an object oriented approach for XML construction and management, avoiding or solving many common issues related to Xml manipulation.

You can create XML elements directly.

For e.g., XElement name = new XElement ("name");

The main difference between XPath and LINQ to XML is

XPath is used to navigate through elements and attributes of XML.

XPath can only return collections of nodes from the XML tree, whereas LINQ can execute query, project an object graph or XML tree.

XPath cannot parse the XPath expression at compile time and XPath results are not strongly typed, whereas LINQ to XML query are strongly typed (means, C# knows that these syntax are well formed).

My XML file (books.xml) contains the following:

<?xml version="1.0" encoding="iso-8859-1"?>
<bookstore>
  <book category="C#">
    <title name="Complete Reference 3.0" pub="Mc Graw Hill">
      <author>Herbert Schildt</author>
      <year>2009</year>
      <price>400.00</price>
    </title>
  </book>
  <book category="ASP.NET">
    <title name="Beginning ASP.NET 3.5" pub="Wrox">
      <author>Imar Spaanjaars</author>
      <year>2008</year>
      <price>450.00</price>
    </title>
  </book>
  <book category="C#">
    <title name="Head First C#" pub="O'Reilly">
      <author>Andrew Stellman</author>
      <author>Jennifer Greene</author>
      <year>2008</year>
      <price>350.00</price>
    </title>
  </book>
  <book category="C#">
    <title name="Professional C# 2008" pub="Wrox">
      <author>Christian Nagel</author>
      <year>2008</year>
      <price>500.00</price>
    </title>
  </book>
  <book category="ASP.NET">
    <title name="Pro ASP.NET 3.5" pub="Apress">
      <author>Matthew MacDonald</author>
      <year>2007</year>
      <price>450.00</price>
    </title>
  </book>
</bookstore>

XDocument doc = XDocument.Load(Server.MapPath("books.xml"));

The above line is used to load XML file to the XDocument.

1. To add new node

doc.Element("bookstore").Add(new XElement("book",
                             new XAttribute("category", "C#"),
                                   new XElement("title",
                                   new XAttribute("name", "C# Basics"),
                                     new XElement("author", "Sakthi"),
                                     new XElement("year", "2010"),
                                     new XElement("price", "250.00"))));

The above code will add new node called book with attribute category C# at the end.

2. To get all attribute values of Title i.e., name and pub

IEnumerable attribute = (IEnumerable)doc.XPathEvaluate("bookstore/book/title/@*");
foreach (XAttribute xattr in attribute)
{
    Response.Write(xattr.Name + " = " + xattr.Value + "</br>");
}

IEnumerable - Returns an enumerator that iterates through a collection.

XPathEvaluate - Evaluates a given XPath expression.i.e., it will locate the attributes in the given XPath expression.

I used foreach to loop through the values returned by the XPath and displays attribute name and its value.

3. To add attribute to a particular element.

I tried two ways, One with query and other with XElement.

First let's see, using query

var query2 = from getNode in doc.Descendants("book").Descendants("title")
                          where getNode.Attribute("name").Value == "C# Basics"
                          select getNode;
foreach (XElement el in query2)
{
      el.SetAttributeValue("pub", "shree");
}

This query is similar to Sql query. Here select should be placed at the last. Where condition is used to check whether the title has the attribute value C# Basics. Descendants is used to returns the collection of descendant element for the book and title. Using the SetAttributeValue, set attribute  name as pub and value as shree.

The other way is to use XElement

XElement elem = doc.Descendants("book").Descendants("title").Where(c => c.Attribute("name").Value == "C# Basics").FirstOrDefault();
if (elem != null)
{
    elem.SetAttributeValue("pub", "shree");
}

This line of code is very simple to understand it selects the first node that matches the criteria and adds the attribute name as pub and value as shree using SetAttributeValue.

Finally save XML using the following line

doc.Save(Server.MapPath("books.xml"));

Hope this article helps you.


Similar Articles