I have written a LINQ to XML query that does what I want, but it looks pretty ugly. I am wondering, how would you guys format the following query in a way that doesn’t look quite so garish?
Apologies if my example is a bit verbose.
The XML documents I am querying have the following structure:
<?xml version='1.0' encoding='iso-8859-1'?> <newsitem itemid='1' id='root' date='1996-08-20' xml:lang='en'> <title>A title</title> <headline>A headline</headline> <dateline>A dateline</dateline> <text> Some text </text> <metadata> <codes class=''> <code code=''> <editdetail attribution=''/> </code> </codes> <dc element='dc.date.created' value=''/> <dc element='dc.publisher' value=''/> <dc element='dc.date.published' value=''/> <dc element='dc.source' value=''/> <dc element='dc.creator.location' value=''/> <dc element='dc.creator.location.country.name' value=''/> <dc element='dc.source' value=''/> </metadata> </newsitem>
And corresponding LINQ query:
XElement dummy = new XElement('dummy'); var query = from article in newsdoc.Elements('newsitem').DefaultIfEmpty(dummy) select new { NewsItemID = (int)article.Attribute('itemid'), Date = (DateTime)article.Attribute('date'), Title = (string)article.Element('title'), Headline = (string)article.Element('headline'), ByLine = (string)article.Element('byline'), DateLine = (string)article.Element('dateline'), NewsText = (string)article.Element('text'), Publisher = (string)article.Elements('metadata').Elements('dc').Where(x => (string)x.Attribute('element') == 'dc.publisher').Attributes('value').DefaultIfEmpty().ElementAt(0), DatePublished = (DateTime)article.Elements('metadata').Elements('dc').Where(x => (string)x.Attribute('element') == 'dc.date.published').Attributes('value').DefaultIfEmpty().ElementAt(0), Source = (string)article.Elements('metadata').Elements('dc').Where(x => (string)x.Attribute('element') == 'dc.source').Attributes('value').DefaultIfEmpty().ElementAt(0), CreatorLocation = (string)article.Elements('metadata').Elements('dc').Where(x => (string)x.Attribute('element') == 'dc.creator.location').Attributes('value').DefaultIfEmpty().ElementAt(0), CreatorLocationCountryName = (string)article.Elements('metadata').Elements('dc').Where(x => (string)x.Attribute('element') == 'dc.creator.location.country.name').Attributes('value').DefaultIfEmpty().ElementAt(0), Codes = article.Elements('metadata').Elements('codes').Elements('code').Attributes('code').DefaultIfEmpty() };
Thanks!
The main ‘ugly’ there is the stuff at the bottom. I would probably add an extension method (or just a utility method) – something like:
then you should be able to use something like:
(unchecked)