REST with LINQ to XML
With LINQ to XML, what I have learned so far, it's awesome, it is not only the first class concept of processing XML data, but also let you process a complex XML doc in the most simplest and readable way.
I have a project called, Linq.Flickr , and I often need to process XML data for REST query.
To show a simple example of LINQ to XML, lets take a REST response from a Flickr method called flickr.people.getUploadStatus and see how it is processed.
<user id="12037949754@N01" ispro="1">
<bandwidth maxbytes="2147483648" maxkb="2097152"
usedbytes="383724" usedkb="374" remainingbytes="2147099924" remainingkb="2096777" />
<filesize maxbytes="10485760" maxkb="10240" />
<sets created="27" remaining="lots" />
Before .net 3.5. it could have been done by GetElementyByTagName("users") - > inside the while loop getting the element, reading value, storing it in private variables , going to next sibling and repeat, if nested , then take the first child and so forth. But , in .net 3.5 using LINQ , the translation is not only just like XML itself, moreover , in XElement.Load , we can directly pass the REST query string.
So, Two, steps to do a REST with LINQ
- Build the URL and pass it to XElement.Load
- Parse the response and take necessary actions.
For example, for the above XML, I wrote something like below, in PhotoRepository.cs, that does a selective parsing.
XElement element = GetElement(##REQUEST URL##);
People people = (from p in element.Descendants("user")
select new People
Id = p.Attribute("id").Value ?? string.Empty,
Convert.ToInt32(p.Attribute("ispro").Value) == 0 ? false : true,
(from b in element.Descendants("bandwidth")
select new BandWidth
UsedKB = Convert.ToInt32(b.Attribute("usedkb").Value)
catch (Exception ex)
throw new ApplicationException("Could not process response", ex);
Note :GetElement is a local method that does a XElement.Load, with some validation check.
Here my Client-Side object looks like
The most interesting thing is, everything is done on the fly , no loop, no intermediate result tracking, no headache of sibling and first child.Overall, the code has a high point in terms of readability.
Take that !!