我正在使用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轮并不是“做得对”。
答案 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>