我正在使用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轮子并不是"做对了"。
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()
方法中引用该字符串,而不是使用显式但冗余的格式字符串。