如何使用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'节点丢失?)。

如何使用linq将xml映射到一个类

我想你在找这个:

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来完成此任务。它可以工作,但是对于大型类来说会变得非常麻烦。