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?
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