2012-07-17 98 views
10

我使用的XDocument创建一个XML文件,内容如下:如何创建日期时间的XElement代表日期,类型为xs:日期

var d = DateTime.Now; 

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

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

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

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


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

要说清楚,我并不是想要“完成它”,我正在寻找“做对”。重新发明XML轮盘在我的书中并不是“正确的”。

+1

我相信你会需要使用'的ToString()'否则它只是转换你用'的ToString()传递给它的字符串变种对象指定的格式'所以你必须在自定义传格式 – V4Vendetta 2012-07-17 12:03:54

回答

5

由于已经指出LINQ to XML无法使用xs:date格式生成DateTime值。 A 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不会产生期望的结果。

0

似乎存在一些混淆XML,或者像这样XElement会将Value存储为一个字符串。存储的内容更多的是Xml Schema Validator的工作。

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

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

希望这可以帮助你。

+0

我知道XElement存储一个字符串。不过,我的问题是如何在不使用硬编码格式字符串的情况下创建字符串。 X ...命名空间中必须有一个函数来为我做这件事? – 2012-07-17 13:09:57

0

A 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()方法,而不是一个拉格式字符串明确但冗余的格式字符串。

+0

谢谢,但正如我对V4Vendetta“说的”,我认为我不需要知道如何正确格式化XML日期。我的意思是,我*知道如何(yyyy-MM-dd),但我不认为如果没有函数来完成这个工作,XML创建API就不会完成。所以我非常有信心在某个地方会有这样的功能 - 我的问题仅仅是“在哪里”。 – 2012-07-17 16:14:42

+1

并且为了记录,xs:date的形式不是由我的模式定义的,而是由W3C定义的:-) – 2012-07-17 16:15:45

+0

也许'XmlReader.ReadAsDateTime()'会执行。默认情况下,根据W3C规则尝试DateTime(ing)。 – radarbob 2012-07-17 17:20:51

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)); 
相关问题