2011-06-10 20 views
13

我試圖反序列化的XML文件到幾類對象:藝術家,專輯和歌曲反序列化的XElement成Class(S)

這是當前設置:

static void Main(string[] args) 
    { 
     var riseAgainst = DeSerializer(CreateElement()); 
     Console.WriteLine(string.Format("Band: {0}",riseAgainst.Name)); 
     Console.WriteLine("-----------------------------"); 
     Console.WriteLine(string.Format("Album: {0}",riseAgainst.Album.Name)); 
     Console.WriteLine("-----------------------------"); 
     Console.WriteLine("Song List:\r"); 
     foreach(var s in riseAgainst.Album.Songs) 
     { 
      Console.WriteLine(string.Format("Song: {0}", s)); 
     } 
     Console.ReadLine(); 
    } 

    static XElement CreateElement() 
    { 
     return new XElement("Artist", 
       new XElement("Name", "Rise Against"), 
       new XElement("Album", 
        new XElement("Name", "Appeal to Reason"), 
        new XElement("Songs", 
         new XElement("Song", "Hero of War"), 
         new XElement("Song", "Savior")) 
         ) 
      ); 
    } 

    static Artist DeSerializer(XElement element) 
    { 
     var serializer = new XmlSerializer(typeof(Artist)); 
     return (Artist)serializer.Deserialize(element.CreateReader()); 
    } 
} 

public class Artist 
{ 
    public string Name { get; set; } 
    public Albums Album { get; set; } 
} 

public class Albums 
{ 
    public string Name { get; set; } 
    public Songs Songs { get; set; } 
} 

public class Songs 
{ 
    public string Song { get; set; } 
} 

這個問題我目前有如果有多個藝術家,專輯和/或歌曲,那麼它只填充第一個。我怎樣才能使它充滿所有的專輯,或爲藝術家的所有歌曲...等我試着把它們設置爲陣列,但它沒有奏效。提前致謝。

+0

向我們展示一個_more_ than 1藝術家和反序列化代碼的列表。提示:你還有一個「藝術家」班嗎? – 2011-06-10 20:19:54

回答

17

我所以現在修改你的類一點點的藝術家有一個List<Album>和相冊有List<Songs>

我不得不修改生成的XML一點點,以確保其正常填充類。這裏是代碼

static void Main(string[] args) 
{ 
    var riseAgainst = DeSerializer(CreateElement()); 
     Console.WriteLine(string.Format("Band: {0}",riseAgainst.Name)); 
     Console.WriteLine("-----------------------------"); 
     Console.WriteLine(string.Format("Album: {0}",riseAgainst.Albums.First().Name)); 
     Console.WriteLine("-----------------------------"); 
     Console.WriteLine("Song List:\r"); 
     foreach(var s in riseAgainst.Albums.First().Songs) 
     { 
      Console.WriteLine(string.Format("Song: {0}", s.Name)); 
     } 
     Console.ReadLine(); 



    static XElement CreateElement() 
    { 
     return new XElement("Artist", 
       new XElement("Name", "Rise Against"), 
       new XElement("Albums", 
        new XElement("Album", 
         new XElement("Name", "Appeal to Reason"), 
         new XElement("Songs", 
          new XElement("Song", new XElement("Name", "Hero of War")), 
          new XElement("Song", new XElement("Name", "Savior"))) 
         )) 
      ); 
    } 

    static Artist DeSerializer(XElement element) 
    { 
     var serializer = new XmlSerializer(typeof(Artist)); 
     return (Artist)serializer.Deserialize(element.CreateReader()); 
    } 
} 

public class Artist 
{ 
    public string Name { get; set; } 
    public List<Album> Albums { get; set; } 
} 

public class Album 
{ 
    public string Name { get; set; } 
    public List<Song> Songs { get; set; } 
} 

public class Song 
{ 
    public string Name { get; set; } 
} 

希望有所幫助。這不包括你想要多個藝術家的情況。

+0

這正是我需要的。謝謝!我沒有考慮使用List ...腦屁! :P再次感謝! – Alex 2011-06-10 20:38:11

+0

不客氣! – marto 2011-06-10 20:54:33