Чтение внутреннего списка только с LinqToXml - PullRequest
3 голосов
/ 13 апреля 2009

С LinqToXml я хотел бы зачитать список альбомов для данного исполнителя из XML-файла, например

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

Я попробовал следующее с LinqToXml. Тем не менее, я хотел бы избежать создания экземпляра объекта Artist ...

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;

Обновление: моя текущая «лучшая» попытка: Смотрите принятый ответ.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2009

Попробуйте что-то вроде этого:

    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();
1 голос
/ 13 апреля 2009

Это должно быть что-то вроде:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...