2012-07-17 30 views
10

Tôi đang sử dụng XDocument để tạo ra một tập tin XML, như sau:Làm thế nào để tạo XElement ngày đại diện trong DateTime as type xs: Ngày

var d = DateTime.Now; 

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

Tuy nhiên, XML kết quả đại diện cho ngày d sử dụng xs: định dạng ngày giờ (ví dụ: "2012-05-11T00: 00: 00"). Tức là, nó bao gồm thông tin thời gian.

Tuy nhiên, XML của tôi có nghĩa là khớp với Lược đồ XML của tôi, xác định phần tử này thuộc loại "xs: date". Do đó, tệp bị từ chối khi được xác thực đối với giản đồ, vì thông tin thêm thời gian.

Làm cách nào để khắc phục sự cố này? Tôi biết tôi chỉ có thể định dạng ngày mình bằng cách sử dụng ToString() với một định dạng, nhưng điều này không thể là "đúng" cách để làm điều đó, chắc chắn. Tôi không thể dự kiến ​​sẽ biết cách định dạng một ngày làm ngày XML hợp lệ - đó là công việc của các phần liên quan đến XML của khung công tác.


Sửa: xin lưu ý rằng tôi làm biết làm thế nào để định dạng một ngày sử dụng ToString(), và tôi cũng biết định dạng chuỗi sẽ cho tôi kết quả đúng. Đó không phải là câu trả lời tôi đang tìm kiếm. Tôi đang tìm một hàm/phương thức/lớp để hiểu ngày xs: date (vv) là gì và nó hỗ trợ các kiểu mã hóa đó.

Để rõ ràng, tôi không muốn "hoàn thành", tôi đang tìm cách "làm đúng". Và tái phát minh ra bánh xe XML không phải là "làm đúng" trong cuốn sách của tôi.

+1

Tôi tin rằng bạn sẽ cần phải chỉ định định dạng bằng cách sử dụng 'ToString()' khác chỉ chuyển đổi đối tượng bạn chuyển sang biến thể chuỗi của nó bằng '.ToString()', do đó bạn sẽ phải chuyển sang tùy chỉnh định dạng – V4Vendetta

Trả lời

5

Vì nó đã được chỉ ra LINQ to XML không thể tạo ra giá trị DateTime sử dụng định dạng xs:date. A DateTime các chuyến đi khứ hồi trong LINQ to XML bằng định dạng xs:dateTime và.NET không phải là một loại chỉ có ngày tháng, do đó, nó không phải là một bất ngờ rằng các nhà thiết kế của LINQ to XML quyết định chỉ sử dụng xs:dateTime để không làm phức tạp các API.

Tùy chọn duy nhất là định dạng ngày làm chuỗi cung cấp cho bạn toàn quyền kiểm soát định dạng. Để sử dụng một cách chính xác định dạng xs:date bạn cần phải chuyển đổi DateTime thành một chuỗi sử dụng mã này:

d.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture) 

Sử dụng ToShortDateString và/hoặc không xác định một CultureInfo sẽ không tạo ra kết quả mong muốn.

0

Dường như có một số nhầm lẫn XML hoặc như vậy, XElement sẽ lưu trữ Giá trị dưới dạng chuỗi. Những gì được lưu trữ là nhiều hơn một công việc của Xml Schema Validator.

Do đó, khi bạn phải đại diện cho Date, bạn sẽ phải chuyển phiên bản chuỗi của phần Ngày bạn có thể sử dụng ToShortDateString() hoặc định dạng tùy chỉnh trong ToString().

Khi bạn đang chuyển thể hiện DateTime, nó chỉ gọi ToString() chứa thành phần Thời gian.

Hy vọng điều này sẽ giúp bạn.

+0

Tôi hiểu rằng XElement lưu trữ một chuỗi. Câu hỏi của tôi là, tuy nhiên, làm thế nào để tạo ra chuỗi mà không cần đến một chuỗi định dạng mã hóa cứng. Phải có một hàm trong không gian tên X ... để làm điều này cho tôi? –

0

A DateTimeluôn luôn có cả thành phần ngày và giờ. Vì vậy, lừa được nói rằng DateTime để chỉ xuất thành phần ngày tháng của nó. Khi bạn hoàn nguyên ngày trên đầu nhận, thời gian sẽ mặc định là nửa đêm.

var XDocument = new XDocument(new XElement("ThisIsADate", DateTime.Now.ToShortDateString())); 

Biểu mẫu mặc định là M/d/yyyy nhưng vẫn có thể không đúng định dạng! Tôi không biết giản đồ của bạn là gì.

Vì vậy, sử dụng ToString("yourFormatStringHere")

var XDocument = new XDocument(new XElement("ThisIsADate", DateTime.Now.ToString("M-dd-yyyy"))); 

Nếu bạn muốn nhận được sự ưa thích, đó là, viết mã mạnh mẽ ... Kéo chuỗi định dạng từ tài liệu giản đồ của bạn và tham chiếu trong phương pháp ToString() thay vì phải một chuỗi định dạng rõ ràng nhưng dư thừa.

+0

Cảm ơn, nhưng khi tôi "nói" với V4Vendetta, tôi không nghĩ rằng nó thích hợp để tôi phải biết cách định dạng chính xác ngày XML. Ý tôi là, tôi * biết * làm thế nào (yyyy-MM-dd), nhưng tôi không nghĩ rằng một API tạo XML hoàn tất mà không có một hàm để làm điều này. Vì vậy, tôi khá tự tin rằng sẽ có một chức năng để làm điều này ở đâu đó - và câu hỏi của tôi chỉ đơn thuần là "ở đâu?". –

+1

Và đối với bản ghi, hình thức của một xs: date không được định nghĩa bởi lược đồ của tôi, nhưng bởi W3C :-) –

+0

Có lẽ 'XmlReader.ReadAsDateTime()' sẽ làm. Theo mặc định, lần này sẽ cố gắng DateTime (ing) theo các quy tắc W3C. – radarbob

2

Tôi cố định vấn đề này bằng cách sử dụng lớp sau cho DateElements

private class XDateElement : XElement 
{ 
    public XDateElement(XName name, DateTime Date) : 
    base(name, Date.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)) 
    { } 
} 

Ưu điểm của việc sử dụng một lớp học như thế này là, rằng bạn có chuyển đổi ngày cụ thể chỉ ở một nơi.

var d = DateTime.Now; 
var xDocument = new XDocument(new XDateElement("ThisIsADate", d)); 
Các vấn đề liên quan