2011-06-10 11 views
13

Estoy tratando de deserializar un archivo XML en un par de objetos de clase: artista, álbum y cancionesDeserialize XElement en la Clase (s)

Aquí es la configuración actual:

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

El problema que Actualmente tiene es si hay más de un artista, álbum y/o canción, entonces solo llena el primero. ¿Cómo puedo hacerlo para que los llene todo para el álbum, o todas las canciones para el artista ... etc. Intenté configurarlas como arreglos pero no funcionó. Gracias por adelantado.

+0

El mostrarnos una lista con _más_ de 1 artista, y el código deserialize. Sugerencia: ¿también tienes una clase 'Artistas'? –

Respuesta

17

I modificado sus clases un poco por lo que ahora tiene un Artista y Álbum List<Album> tiene List<Songs>

tuve que modificar el código XML generado un poco para asegurarse de que rellena las clases correctamente. Aquí está el código

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

Espero que ayude. Esto no cubre el caso en el que desea más de un artista.

+0

Eso es exactamente lo que necesitaba. ¡Gracias! No pensé en usar List ... Brain fart! : P Gracias de nuevo! – Alex

+0

¡De nada! – marto

Cuestiones relacionadas