2012-07-17 18 views
10

मैं एक एक्सएमएल फ़ाइल बनाने के लिए XDocument उपयोग कर रहा हूँ:प्रकार XS के रूप में दिनांक समय में XElement का प्रतिनिधित्व करने की तारीख को बनाने के लिए कैसे: इस प्रकार, दिनांक

var d = DateTime.Now; 

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

हालांकि, जिसके परिणामस्वरूप एक्सएमएल तारीख घ XS का उपयोग कर का प्रतिनिधित्व करता है: डेटाटाइम प्रारूप (उदाहरण के लिए "2012-05-11T00: 00: 00")। यही है, इसमें समय की जानकारी शामिल है।

हालांकि, मेरा एक्सएमएल मेरा एक्सएमएल स्कीमा से मेल खाता है, जो तत्व को "xs: date" प्रकार के रूप में परिभाषित करता है। नतीजतन, अतिरिक्त समय की जानकारी के कारण, स्कीमा के खिलाफ मान्य होने पर फ़ाइल अस्वीकार कर दी जाती है।

मैं इसे कैसे ठीक कर सकता हूं? मुझे पता है कि मैं सिर्फ प्रारूप के साथ ToString() का उपयोग कर तारीख को प्रारूपित कर सकता हूं, लेकिन यह निश्चित रूप से ऐसा करने का "सही" तरीका नहीं हो सकता है। मुझे यह जानने की उम्मीद नहीं की जा सकती कि एक वैध XML तिथि के रूप में दिनांक कैसे प्रारूपित किया जाए - यह ढांचे के एक्सएमएल से संबंधित भागों का काम है।


संपादित: कृपया ध्यान दें कि मुझे क्या करना जानते हैं कि कैसे एक तिथि का उपयोग कर toString() फ़ॉर्मेट करने के लिए, और मैं यह भी पता है कि प्रारूप स्ट्रिंग मुझे सही परिणाम देना होगा। यही वह जवाब नहीं है जिसे मैं ढूंढ रहा हूं। मैं एक फ़ंक्शन/विधि/कक्षा की तलाश में हूं जो समझता है कि xs: date (आदि) क्या है, और यह उन प्रकार के एन्कोडिंग का समर्थन करता है।

स्पष्ट होने के लिए, मैं "इसे पूरा करने" की तलाश नहीं कर रहा हूं, मैं "इसे सही करने" की तलाश में हूं। और एक्सएमएल व्हील का पुन: आविष्कार करना मेरी पुस्तक में "सही कर रहा है" नहीं है।

+1

मेरा मानना ​​है कि आप 'ToString()' किसी और इसकी सिर्फ वस्तु आप '.ToString() द्वारा अपने स्ट्रिंग संस्करण को पारित परिवर्तित करने का उपयोग कर प्रारूप निर्दिष्ट करने की आवश्यकता होगी' कस्टम में पारित करने के लिए ताकि आप होगा प्रारूप – V4Vendetta

उत्तर

5

जैसा कि पहले से ही इंगित किया गया है कि LINQ से XML मान का उपयोग xs:date प्रारूप का उपयोग करने में असमर्थ है। DateTimexs:dateTime प्रारूप का उपयोग कर LINQ से XML में राउंड-ट्रिप और।नेट के पास केवल दिनांक का प्रकार नहीं है, इसलिए यह आश्चर्य नहीं है कि LINQ से XML के डिज़ाइनर ने एपीआई को जटिल नहीं करने के लिए केवल xs:dateTime का उपयोग करने का निर्णय लिया है।

एकमात्र विकल्प प्रारूप को प्रारूप के पूर्ण नियंत्रण देने के लिए एक स्ट्रिंग के रूप में प्रारूपित करना है। सही ढंग से xs:date प्रारूप का उपयोग करने के लिए आप एक स्ट्रिंग इस कोड का उपयोग करने के लिए DateTime बदलने की आवश्यकता:

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

ToShortDateString का उपयोग और/या निर्दिष्ट करके CultureInfo वांछित परिणाम उपज नहीं होगा नहीं।

0

कुछ भ्रम एक्सएमएल लगता है या ऐसा XElement मूल्य को स्ट्रिंग के रूप में संग्रहीत करेगा। संग्रहीत किया जाता है एक्सएमएल स्कीमा वैलिडेटर का अधिक काम है।

इसलिए आप का प्रतिनिधित्व करने के लिए है जब Date आप दिनांक हिस्सा आप ToString() में ToShortDateString() या कस्टम स्वरूप का उपयोग कर सकते हैं की स्ट्रिंग संस्करण में पारित करने के लिए होगा।

जब आप डेटटाइम इंस्टेंस पास कर रहे हैं तो यह केवल ToString() को कॉल कर रहा है जिसमें टाइम घटक भी शामिल है।

उम्मीद है कि यह आपकी मदद करता है।

+0

मैं समझता हूं कि XElement एक स्ट्रिंग स्टोर करता है। मेरा सवाल यह है कि, हार्ड-कोडित प्रारूप स्ट्रिंग का उपयोग किए बिना स्ट्रिंग कैसे बनाएं। एक्स के भीतर एक समारोह होना चाहिए ... नामस्थान मेरे लिए ऐसा करने के लिए? –

0

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 को "कहा" कहा, मुझे नहीं लगता कि यह मेरे लिए उचित है कि एक्सएमएल तिथि को सही तरीके से प्रारूपित करना है। मेरा मतलब है, मैं * जानता हूं कि कैसे (yyyy-MM-dd), लेकिन मुझे नहीं लगता कि एक XML-निर्माण API ऐसा करने के लिए कोई फ़ंक्शन किए बिना पूरा हो गया है। तो मुझे पूरा भरोसा है कि कहीं ऐसा करने के लिए एक समारोह होगा - और मेरा प्रश्न केवल "कहां है?"। –

+1

और रिकॉर्ड के लिए, xs का रूप: दिनांक मेरी स्कीमा द्वारा परिभाषित नहीं किया गया है, लेकिन W3C :-) –

+0

शायद 'XmlReader.ReadAsDateTime()' करेगा। डिफ़ॉल्ट रूप से यह डब्ल्यू 3 सी नियमों के अनुसार डेटटाइम (आईएनजी) का प्रयास करता है। – radarbob

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));