SIGN UP MEMBER LOGIN:    
ARTICLE

LINQ to XML in Silverlight 3.0

Posted by Dhananjay Kumar Articles | Silverlight with C# February 23, 2010
This article will explain how to use LINQ to XML to read data from a XML file and bind that to Silverlight 3.0 DataGrid.
Reader Level:
Download Files:
 

Objective 

This article will explain how to use LINQ to XML to read data from a XML file and bind that to SILVERLIGHT 3.0 Data Grid.  XML file will be read in a WCF service and WCF service will return a List to be bind in a Grid. 

Step 1

Create a Silverlight application.  Select hosting in Web Application project option. 

1.gif 

Step 2: Add XML file in Web project.  

If you have any existing XML file add that by selecting Add Existing Item option by right clicking on WEB (SilverLightApplication1.Web) project  else select add new item option and select XML file from DATA tab. Copy paste the below XML file in your newly created XML file.  Give any name of your choice to XML file. Name I am giving is Books.Xml.

Your XML file in Web Application project must look like. 

Books.XML 

<?xml version="1.0"?>
<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>
      An in-depth look at creating applications with XML.
    </description>
  </book>
  <book id="bk102">
    <author>Ralls, Kim</author>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>
      A former architect battles corporate zombies,
      an evil sorceress, and her own childhood to become queen
      of the world.
    </description>
  </book>
  .....
  .....
  .....
</catalog>

Step 2: Creating WCF service 

Right click on Web Project and add WCF service from Web tab. Give any name of your choice, I am giving name here MyService.

2.gif 

Creating Data Contract 

This class will get serialized at client side. 

[DataContract]
    public class BooksDTO
    {
     [DataMember]
        public string Id { get; set; }
     [DataMember]
        public string Author { get; set; }
     [DataMember]
        public string Title { get; set; }
     [DataMember]
        public string Genere { get; set; }
     [DataMember]
        public string Price { get; set; }
     [DataMember]
        public string PublishDate { get; set; }
     [DataMember]
        public string Description { get; set; }
 }

Creating Service Contract 

IMyService.cs

namespace SilverlightApplication1.Web
{
    [ServiceContract]
    public interface IMyService
    {
        [OperationContract]
        List<BooksDTO> GetBookDetails();
    }
}

Creating Service Implementation 

MyService.svc.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.Web;
using System.Xml.Linq; 

namespace SilverlightApplication1.Web
{
    public class MyService : IMyService
    {
        public List<BooksDTO> GetBookDetails()
        {
            XDocument  xmlDocument  = XDocument.Load(@"c:\\Books.XML");
            var books = from r in xmlDocument.Descendants("book")
                                   select new BooksDTO
                                   {
                                       Author = r.Element("author").Value,
                                       Title = r.Element("title").Value,
                                       Genere = r.Element("genre").Value,
                                       Price = r.Element("price").Value,
                                       PublishDate = r.Element("publish_date").Value,
                                       Description = r.Element("description").Value,
                                   };
           return books.ToList();
        }
    }
}

Few points 
  1. Using namespace System,.XML.Linq  to use LINQ to XML features. 
  2. Load method of XDocument class is being used to load XML document. 
  3. Searching for all the descendents in XML document for the element Book. And retrieving all the child elements value. 
  4. Service is returning List of BooksDTO class. 
Compile the web project and after successfully compilation right click on service and view in browser. 

Step 3: Consuming in Silverlight client 
  1. Add Service Reference. 
  2. While adding service reference, select advanced tab and change return type from Array to List. 
  3. Add Data Grid on XAML. Give any name. I am giving name here MyGrid. 
  4. On page load simply bind the result returning from service to Data Grid. 
  5. Make sure your startup project is SilverLightApplication1.Web and startup page is SilverLightApplicatio1Testpage.aspx . Else you might yield with Cross domain problem. 
MainPage.Xaml

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    <Grid x:Name="LayoutRoot" Background="White">
        <my:DataGrid x:Name="myGrid" AutoGenerateColumns="True" Background="Azure" ></my:DataGrid>        
    </Grid>
</UserControl>

MainPage.Xaml.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using SilverlightApplication1.ServiceReference1; 

namespace SilverlightApplication1
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            MyServiceClient proxy = new MyServiceClient();
            proxy.GetBookDetailsCompleted += new EventHandler<GetBookDetailsCompletedEventArgs>(proxy_GetBookDetailsCompleted);
            proxy.GetBookDetailsAsync();
        }
        void proxy_GetBookDetailsCompleted(object sender, GetBookDetailsCompletedEventArgs e)
        {
            myGrid.ItemsSource = e.Result;
        }
    }
}

Output 

 3.gif

Conclusion 

I have explained how to return data from XML file using LINQ to XML and bind to Silverlight datagrid.  In next article I will show other CRUD operations. Thanks for reading. 

Login to add your contents and source code to this article
share this article :
post comment
 

thanks Dhananjay ,
but could you please help me , i don't understand any step :

  1. Add Service Reference. 
  2. While adding service reference, select advanced tab and change return type from Array to List. 

I tried right click on SilverLightApplication1 , then click "Add Service Reference"   -> advanced , and I didn't see anything to change return type.
please help me . thanks

Posted by thong phan Nov 09, 2010

Hi,
I'll check it again as I am not able to open the project/Solution. may be there is some problem in zib or else
anyhow thanks for reply

Posted by Imran Javed Aug 02, 2010

Hi ,

LINQ is feature of langauge C# not of framework , so there should be no problem between VS2008 or VS2010.

 

This code is wrriten in VS2008 so , I beleive you should get it running.

 

If you send me the error screen short , then it would be easier for me to help you out.

 

Thanks

Posted by Dhananjay Kumar Aug 01, 2010

Hi,
I am not able to open this code in VS 2008. Is it in VS 2010 or there is some bug?
Thanks

Posted by Imran Javed Jul 28, 2010
6 Months Free & No Setup Fees ASP.NET Hosting!
Become a Sponsor
PREMIUM SPONSORS
  • Finally – a virtual platform that delivers next-generation Windows Server 2008 Hyper-V virtualization technology from a managed hosting partner you can truly depend on. Visit www.maximumasp.com/max for a FREE 30 day trial. Hurry offer ends soon. Climb aboard the MaxV platform and take advantage of High Availability, Intelligent Monitoring, Recurrent Backups, and Scalability – with no hassle or hidden fees. As a managed hosting partner focused solely on Microsoft technologies since 2000, MaximumASP is uniquely qualified to provide the superior support that our business is built on. Unparalleled expertise with Microsoft technologies lead to working directly with Microsoft as first to offer IIS 7 and SQL 2008 betas in a hosted environment; partnering in the Go Live Program for Hyper-V; and product co-launches built on WS 2008 with Hyper-V technology.
    Get 2 Months Free of ASP.NET Hosting for Only $4.95/month! Receive FREE MS SQL and MySQL Databases Including ASP.NET 4/3.5, MVC 3.0, Silverlight 4, Windows 2008/IIS 7.0 Plus FREE IIS 7 Modules. Host UNLIMITED ASP.NET Web Sites - Click Here!
6 Months Free & No Setup Fees ASP.NET Hosting!
Become a Sponsor