说我的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(比如说“消息”节点丢失了?)。
答案 0 :(得分:2)
我认为你正在寻找:
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
标记不会成为问题。如果(string)doc.Root.Element("message")
元素下没有null
元素,message
将返回doc.Root
。
但是,如果缺少date
元素,它将崩溃。这是因为无法将null
分配给DateTime
属性。
答案 1 :(得分:0)
如果您可以修复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来做到这一点。它可以工作,但是对于大班来说会很麻烦。通过这种方式,您的代码可扩展性更强。