2011-06-10 16 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