2012-07-17 77 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)); 
相關問題