11

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

var d = DateTime.Now;

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

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

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

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


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

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

4

4 回答 4

7

正如已经指出的那样,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和/或不指定 aCultureInfo不会产生预期的结果。

于 2013-09-13T19:40:36.323 回答
3

我使用以下 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));
于 2015-04-09T14:55:34.760 回答
0

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

因此,当您必须表示时,您必须Date传入 Date 部分的字符串版本,您可以ToShortDateString()使用ToString().

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

希望这对您有所帮助。

于 2012-07-17T12:15:16.530 回答
-1

ADateTime 总是同时具有日期和时间分量。所以诀窍是告诉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()方法中引用它,而不是使用显式但冗余的格式字符串。

于 2012-07-17T15:57:19.340 回答