Search code examples
xmlsilverlightwindows-phone-7linq-to-xml

Load an XML file from a website into XDocument (Silverlight and Windows Phone 7)


I have an XML file that I want to access in an Windows Phone 7 and Silverlight application. Th XML file is on a webserver, and I want to access it through http://www.mydomain.com/data/this_is_my_file.xml.

How do I use this URL to load the XML file into an XDocument?


Solution

  • You can use WebClient or HttpWebRequest to download (asynchronously) and parse the response. One of the simplest approach to download and parse XML from the web is below -

    public void LoadXmlItems(string xmlUrl)
    {
       WebClient client = new WebClient();
       
       client.OpenReadCompleted += (sender, e) =>
       {
            if (e.Error != null)
                return;
    
            Stream str = e.Result;
            XDocument xdoc = XDocument.Load(str);
    
            // take 10 first results
            List<RssFeedItem> rssFeedItems = (from item in xdoc.Descendants("item")
                                                select new XmlItem()
                                                {
                                                    Title = item.Element("title").Value,
                                                    Description = item.Element("description").Value,
                                                    Url = new Uri(item.Element("link").Value, UriKind.Absolute)
                                                }).ToList();
            // close
            str.Close();
    
            // add results to the list
            XmlItems.Clear();
            foreach (RssFeedItem item in rssFeedItems)
            {
               XmlItems.Add(item);
            }
        };
        client.OpenReadAsync(new Uri(xmlUrl, UriKind.Absolute));
    }
    

    xmlUrl is the path to the XML file on the web. XmlItem is a class like so -

    public class XmlItem
    {
      public string Title { get; set; }
      public string Description { get; set; }
      public Uri Url { get; set; }
    }
    

    You need to note that you may encounter cross-thread exception if you are updating an observable collection. In the above example, XmlItems is a List<XmlItem>. However, if you wish to add the XMLItem's to an observable collection, use this piece of code instead -

    Dispatcher.BeginInvoke(() =>
    {
      XmlItems.Clear();
      foreach (RssFeedItem item in rssFeedItems)
      {
         XmlItems.Add(item);
      }
    });
    

    An alternative approach is to use HttpWebRequest. You can read about this approach here and use the code in the sample.

    HTH, indyfromoz