将 XElement 反序列化为类

Posted

技术标签:

【中文标题】将 XElement 反序列化为类【英文标题】:Deserialize XElement into Class(s) 【发布时间】:2011-09-12 18:53:49 【问题描述】:

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

我目前遇到的问题是,如果有多个艺术家、专辑和/或歌曲,那么它只会填充第一个。我怎样才能让它填满专辑的所有内容,或者艺术家的所有歌曲......等等我尝试将它们设置为数组,但它没有用。提前致谢。

【问题讨论】:

向我们展示一个超过位艺术家的列表,以及反序列化代码。提示:你也有Artists 类吗? 【参考方案1】:

我稍微修改了你的类,所以现在 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; 

希望对您有所帮助。这不包括您需要多个艺术家的情况。

【讨论】:

我必须将 [XmlRoot] 属性添加到“Artist”类才能使其正常工作。

以上是关于将 XElement 反序列化为类的主要内容,如果未能解决你的问题,请参考以下文章

将 XElement 反序列化为类

将对象序列化为 XElement 并在内存中反序列化

使用 JsonConvert.DeserializeObject 或 JObject.Parse 将类反序列化为 c# 中的字典

Jackson - 使用泛型类反序列化

如何从不使用 XElement 的自定义 XML 序列化/反序列化为 `Dictionary<int, string>`?

将 xml 反序列化为对象时出错:System.FormatException 输入字符串格式不正确