将 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 反序列化为类的主要内容,如果未能解决你的问题,请参考以下文章
使用 JsonConvert.DeserializeObject 或 JObject.Parse 将类反序列化为 c# 中的字典
如何从不使用 XElement 的自定义 XML 序列化/反序列化为 `Dictionary<int, string>`?