2009-04-13 3 views
3

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

 
<?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. Тем не менее, я хотел бы, чтобы избежать создания экземпляра объекта художника ...

 
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: Мой текущий «лучший» попытка: Смотрите принятый ответ.

ответ

1

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

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

+0

Спасибо за приятный и полезный ответ. –

2

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

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(); 
+0

Спасибо. Первоначальный ответ помог мне упростить выражение с анонимными типами. Но текущий ответ не дает мне ничего нового. И я не уверен, что в памяти появилось «слишком много». (Не то, что это имеет большое значение в реальном приложении, но я хотел бы узнать, как минимизировать использование памяти.) –

Смежные вопросы