将XElement反序列化为类

本文关键字:反序列化 XElement | 更新日期: 2023-09-27 17:58:57

我正在尝试将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; }
}

我目前遇到的问题是,如果有多个艺术家、专辑和/或歌曲,那么它只会填充第一个。我如何才能让它填满专辑中的所有歌曲,或者艺术家的所有歌曲。。。等等,我试着把它们设置为数组,但没有成功。提前谢谢。

将XElement反序列化为类

我稍微修改了一下你的类,所以现在Artist有List<Album>,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; }
}

希望能有所帮助。这不包括你想要多个艺术家的情况。