C# – Reading inner list only with LinqToXml

clinqlinq-to-xml

With LinqToXml I would like to read out the album list for a given artist from an xml file like

<?xml version="1.0" encoding="utf-8" ?>
<artists>
  <artist name="Beatles">
    <albums>
      <album title="Please Please Me" year="1963"/>
      <album title="With the Beatles" year="1963"/>
      ...
    </albums>
  </artist>
  ...

I tried the following with LinqToXml. However, I would like to avoid instantiating an artist object…

XDocument xartists = XDocument.Load(FilePhysicalPath);
var artists = from xartist in xartists.Descendants("artist")
              where xartist.Attribute("name").Value.Equals(id)
              select new MusicArtist
              {
                  Albums = from xalbum in xartist.Descendants("album")
                           select new MusicAlbum
                           {
                               Title = xalbum.Attribute("title").Value,
                               Year =
                               int.Parse(xalbum.Attribute("year").Value)
                           }
              };
var artist = artists.SingleOrDefault();
if (artist != null)
    return artist.Albums;
else
    return null;

Update: My current 'best' attempt:
See the accepted answer.

Best Answer

It should be something like:

var result = from artist in xartists.Root.Elements("artist")
             where artist.Attribute("name").Value.Equals(id)
             let albums = artist.Element("albums")
             from album in albums.Elements("album")
             select new MusicAlbum
             {
                 Title = album.Attribute("title").Value,
                 Year = (int) album.Attribute("year")
             };

Note in particular the use of Element/Elements instead of Descendents