0

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

4

2 回答 2

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(比如说缺少“消息”节点?)。

这取决于你如何描述糟糕的 xmlXDocument如果输入不是正确的 XML 文件,将引发异常。所以您的输入必须是正确的 XML 文件。但是,缺少message标签在这里不会成为问题。如果元素下没有元素,(string)doc.Root.Element("message")将返回。nullmessagedoc.Root

date但是,如果缺少该元素,它将崩溃。那是因为null不能分配给DateTime属性。

于 2013-06-03T16:23:47.823 回答
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 来执行此操作。它可以工作,但是对于大型课程会变得非常麻烦。这样你的代码就更具可扩展性。

于 2013-06-03T16:46:44.117 回答