Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用linq将xml映射到类?_C#_Xml_Linq - Fatal编程技术网

C# 如何使用linq将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”节点?)。我想

假设我的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”节点?)。

我想您正在寻找:

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);