如何在DateTime中创建表示日期的XElement,类型为xs:Date

时间:2012-07-17 11:58:25

标签: c# xml xsd

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

var d = DateTime.Now;

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

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

但是,我的XML旨在匹配我的XML Schema,它将元素定义为“xs:date”类型。因此,由于额外的时间信息,在针对模式进行验证时会拒绝该文件。

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


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

要明确,我不是要“完成它”,我希望“做得对”。在我的书中重新发明XML轮并不是“做得对”。

4 个答案:

答案 0 :(得分:5)

正如已经指出的那样,LINQ to XML无法使用DateTime格式生成xs:date值。使用DateTime格式在LINQ to XML中进行xs:dateTime往返并且.NET不具有仅日期类型,因此LINQ to XML的设计者决定仅使用它并不令人惊讶xs:dateTime不会使API复杂化。

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

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

使用ToShortDateString和/或不指定CultureInfo将无法产生所需的结果。

答案 1 :(得分:2)

我使用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));

答案 2 :(得分:0)

似乎存在一些混淆XML或者因此XElement将Value存储为字符串。存储的内容更多是Xml Schema Validator的工作。

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

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

希望这会对你有所帮助。

答案 3 :(得分:-1)

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()方法中引用格式字符串,而不是使用明确但冗余的格式字符串。< / p>