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

时间:2013-06-03 16:15:31

标签: c# xml linq

说我的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(比如说“消息”节点丢失了?)。

2 个答案:

答案 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来做到这一点。它可以工作,但是对于大班来说会很麻烦。通过这种方式,您的代码可扩展性更强。