Подтвердить что ты не робот

Отключить XElement в класс (ы)

Я пытаюсь десериализовать XML файл в несколько объектов класса: Artist, Album и Songs

Вот текущая настройка:

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

В настоящее время проблема заключается в том, что если есть несколько исполнителей, альбомов и/или песен, то она заполняет только первый. Как я могу сделать это, чтобы он заполнил их все для альбома или все песни для исполнителя... и т.д. Я попытался настроить их как массивы, но он не работал. Спасибо заранее.

4b9b3361

Ответ 1

Я немного изменил свои классы, так что теперь у исполнителя есть 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; }
}

Надеюсь, что это поможет. Это не распространяется на случаи, когда вы хотите больше, чем один художник.