如何使用linq将xml映射到一个类
本文关键字:一个 linq 何使用 xml 映射 | 更新日期: 2023-09-27 18:16:32
假设我的xml是这样的:
<post>
<title>this is a title</title>
<date>2013/06/03</date>
<message>this is a message here</message>
</post>
我有一个类:
public class Post
{
public string Title {get;set;}
public string Message {get;set;}
public DateTime Date {get;set;}
}
我有一个xml文档对象,它有xml.
现在确定如何使用linq来填充它。linq是否处理空值或坏xml(例如说'message'节点丢失?)。
我想你在找这个:
var post = new Post()
{
Title = (string)doc.Root.Element("title"),
Date = (DateTime)doc.Root.Element("date"),
Message = (string)doc.Root.Element("message")
}
并回答您的其他问题:
linq是否处理空值或坏xml(如说'message'节点是失踪?).
这取决于你如何描述坏xml!如果输入不是正确的XML文件,XDocument
将抛出异常。所以输入必须是正确的XML文件。然而,缺少message
标签在这里不会成为问题。如果doc.Root
元素下没有message
元素,则(string)doc.Root.Element("message")
将返回null
。
但是,如果缺少date
元素,它将崩溃。这是因为null
不能分配给DateTime
属性
如果你能修复XML的样式,我会反序列化它
private static string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<Post>
<Title>this is a title</Title>
<ProxyDateTime>2013/06/03</ProxyDateTime>
<Message>this is a message here</Message>
</Post>";
public class Post
{
public string Title { get; set; }
public string Message { get; set; }
[XmlIgnore]
public DateTime Date { get; set; }
public string ProxyDateTime
{
get { return Date.Date.ToString(); }
set { Date = DateTime.Parse(value); }
}
public override string ToString()
{
return String.Join(Environment.NewLine,
new [] {"Title: " + Title, "Date: " + Date, "Message: " + Message});
}
}
样本使用XmlSerializer serializer = new XmlSerializer(typeof (Post));
var post = (Post)serializer
.Deserialize(new MemoryStream(Encoding.ASCII.GetBytes(xml)));
Console.WriteLine(post);
这允许您以强类型的方式处理空值。我过去曾使用LINQ to XML来完成此任务。它可以工作,但是对于大型类来说会变得非常麻烦。