Reading an internal list with LinqToXml only

With LinqToXml, I would like to read the list of albums for a given artist from an XML file, for example

<? 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 creating an instance of the executing 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 Accepted Answer.

+3
source share
2 answers

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")
             };

, , Element/Elements Descendents

+1

- :

    return (from artist in 
                     (from xartist in xartists.Descendants("artist")
                     where xartist.Attribute("name").Value.Equals("Beatles")
                     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)
                                  }
                     })
                  where artist != null
                 select artist).FirstOrDefault();
+2

Source: https://habr.com/ru/post/1706315/


All Articles