如何创建将DateTime中的日期表示为xs:date类型的XElement



我正在使用XDocument创建一个XML文件,如下所示:

var d = DateTime.Now;
var xDocument = new XDocument(new XElement("ThisIsADate", d));

但是,生成的XML使用xs:datetime格式表示日期d(例如"2012-05-11T00:00:00")。也就是说,它包括时间信息。

然而,我的XML是为了匹配我的XMLSchema,它将元素定义为"xs:date"类型。因此,当根据模式进行验证时,由于额外的时间信息,文件将被拒绝。

我该怎么解决这个问题?我知道我可以自己用ToString()格式化日期,但这肯定不是"正确"的方法。不能指望我知道如何将日期格式化为有效的XML日期——这是框架中与XML相关的部分的工作。


编辑:请注意,我确实知道如何使用ToString()格式化日期,我也知道什么格式的字符串会给我正确的结果。这不是我想要的答案。我正在寻找一个函数/方法/类,它能理解xs:date(等等)是什么,并支持这些类型的编码。

需要明确的是,我不想"完成它",我想"把它做好"。在我的书中,重新发明XML轮子并不是"做对了"。

正如已经指出的,LINQ to XML无法使用xs:date格式生成DateTime值。使用xs:dateTime格式和.NET的LINQ to XML中的DateTime round-trips没有日期类型,因此LINQ to XMLs的设计者决定只使用xs:dateTime以避免API复杂化并不令人惊讶。

唯一的选择是将日期格式化为字符串,以便完全控制格式。要正确使用xs:date格式,您需要使用以下代码将DateTime转换为字符串:

d.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)

使用ToShortDateString和/或不指定CultureInfo将不会产生期望的结果。

我使用DateElements 的以下类修复了这个问题

private class XDateElement : XElement
{
   public XDateElement(XName name, DateTime Date) : 
     base(name, Date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture))
   { }
}

使用这样的类的优点是,您只能在一个位置进行特定的日期转换。

var d = DateTime.Now;
var xDocument = new XDocument(new XDateElement("ThisIsADate", d));

XML似乎有些混乱,或者XElement将把Value存储为字符串。存储的更多的是Xml架构验证器的工作。

因此,当您必须表示Date时,您必须传入Date部分的字符串版本,您可以使用ToShortDateString()ToString()中的自定义格式。

当您传递DateTime实例时,它只是调用ToString(),它也包含Time组件。

希望这对你有帮助。

DateTime总是同时包含日期和时间组件。所以诀窍是告诉DateTime只输出它的日期分量。当您在接收端重新设置日期时,时间将默认为午夜。

var XDocument = new XDocument(new XElement("ThisIsADate", DateTime.Now.ToShortDateString()));

默认形式是M/d/yyyy,但它的格式可能仍然不正确!我不知道你的模式期望什么。

所以使用ToString("yourFormatStringHere")

var XDocument = new XDocument(new XElement("ThisIsADate", DateTime.Now.ToString("M-dd-yyyy")));

如果你想获得真正的幻想,也就是说,编写健壮的代码。。。从模式文档中提取格式字符串,并在ToString()方法中引用该字符串,而不是使用显式但冗余的格式字符串。

最新更新