2009-04-13 11 views
3

Mit LinqToXml würde Ich mag die Albumliste für einen bestimmten Künstler aus einer XML-Datei auszulesen wieLeseinnen Liste nur mit 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> 
    ... 

ich mit LinqToXml folgendes versucht. Ich möchte jedoch ein Künstler Objekt vermeiden Instanziieren ...

 
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: Mein aktueller ‚besten‘ Versuch: die akzeptierte Antwort See.

Antwort

1

es so etwas wie sein sollte:

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

Hinweis insbesondere die Verwendung von Element/Elements statt Descendents

+0

Danke für die nette und hilfreiche Antwort. –

2

so etwas wie dieses Versuchen:

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

Dank. Die ursprüngliche Antwort hat mir geholfen, den Ausdruck mit anonymen Typen zu vereinfachen. Aber die aktuelle Antwort gibt mir nichts Neues. Und ich bin mir nicht sicher, ob 'zu viel' im Speicher instanziiert wird. (Nicht, dass es viel in der tatsächlichen Anwendung von Bedeutung ist, aber ich möchte lernen, wie Speicherverbrauch zu minimieren.) –

Verwandte Themen