C# 如何使用linq将xml映射到类?
假设我的xml看起来像:C# 如何使用linq将xml映射到类?,c#,xml,linq,C#,Xml,Linq,假设我的xml看起来像: <post> <title>this is a title</title> <date>2013/06/03</date> <message>this is a message here</message> </post> 我有一个包含xml的xml文档对象 现在确定如何使用linq来填充此文件。linq是否处理空值或错误的xml(比如说缺少“message”节点?)。我想
<post>
<title>this is a title</title>
<date>2013/06/03</date>
<message>this is a message here</message>
</post>
我有一个包含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文件,code>XDocument将引发异常。因此,您的输入必须是正确的XML文件。但是,缺少消息
标记在这里不是问题<如果doc.Root
元素下没有message
元素,则code>(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});
}
}
这允许您以强类型方式处理null。我过去曾使用LINQ到XML来实现这一点。它可以工作,但是对于大型类来说会变得非常麻烦。这样,您的代码更易于扩展。谢谢,那么我如何防止它破坏日期的b/c?我可以使用DateTime.Parse吗?简单的解决方法是使用可为空的DateTime<代码>日期时间?您是否考虑过使用?
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);