.NET

2011-08-03 12 views
8

में DataSet.WriteXml का उपयोग करते समय कस्टम डेटटाइम प्रारूप मुझे एक समस्या मिली है जहां मैं XML में डेटासेट लिख रहा हूं जिसमें डेटटाइम प्रकार का कॉलम है और मैं आउटपुट प्रारूप को नियंत्रित करना चाहता हूं।.NET

2011-08-02T17:39:00-07:00 

मैं एक कस्टम समय स्वरूप का उपयोग करना चाहते हैं, या बहुत कम से कम समय क्षेत्र की जानकारी पट्टी:

DataSet data = LoadDataSet(); 
data.Tables[0].Rows[0]["MyDate"] = DateTime.Now; 
data.WriteXml(myFile); 

डिफ़ॉल्ट रूप से एक्सएमएल में datetime का स्वरूप इस प्रकार हो रहा है।

क्या मेरे डेटासेट एक्सएमएल में डेटटाइम कॉलम के प्रारूप को नियंत्रित करने का कोई तरीका है?

मेरा आंत कहता है कि मुझे लगता है कि यह समय क्षेत्र में डेटा के रूपांतरण की सुविधा के लिए ऐसा किया जाता है, लेकिन मैंने देखा है कि मैं डेटासेट एक्सएमएल को सफलतापूर्वक पढ़ सकता हूं भले ही डेटटाइम कॉलम टैग टाइमज़ोन डेटा को छोड़ दें, इसलिए मैं उम्मीद कर रहा था एक्सएमएल को लिखते समय मैं कुछ समान कर सकता हूं।

+1

मैंने देखा है कुछ डेवलपर्स एक और स्तंभ कहा जाता है को जैसे चाहें चालें का उपयोग ["MyDateString"] जहां वे DateTime.Now.ToShortDateString() का उपयोग करते हैं, यह आदर्श नहीं कह रहे हैं, लेकिन मैंने इसे कुछ संदेशों के लिए धारावाहिक कक्षाओं में पहली बार देखा है जो हम अन्य भागीदारों के साथ आदान-प्रदान करते हैं :) – kd7

+0

हाँ, मैंने अभी उल्लेख किया है एक सहयोगी के लिए। यह शायद हमारी फॉलबैक योजना होगी। –

+0

क्या आप एक्सएसएलटी स्कीमा को परिभाषित कर सकते हैं और इसे एक्सएमएल पर लागू कर सकते हैं, या यह आपके मामले में एक ओवरकिल होगा? – sll

उत्तर

-1

एक्सएमएल में DateTime के लिए एक मानक प्रारूप नहीं है। यह प्रारूप है कि WriteXml उपयोग करेगा। यदि आपको एक अलग प्रारूप की आवश्यकता है, तो आपको DateTime का उपयोग करने की आवश्यकता नहीं है। जैसा कि अन्य ने कहा है, इसके बजाय String का उपयोग करें।

+0

यह एक भूरा क्षेत्र है, जेनरेट की गई फ़ाइलों में कोई स्कीमा संदर्भ नहीं है, इसलिए कुछ भी स्पष्ट रूप से डेटएक्स टैग को डेटएक्सएमएल से टाइप xsd: दिनांक के लिए मजबूर नहीं करता है। मैं सहमत हूं कि xsd: दिनांक का सख्त प्रारूप है, लेकिन मुझे यकीन नहीं है कि यहां उपयोग में जरूरी है। –

+0

आपके विचार की आवश्यकता होगी कि 'WriteXml' डेटा को उस प्रारूप में जेनरेट करें जो 'WriteXmlSchema' से स्कीमा मान्य नहीं होगा। ऐसा असंभव लगता है। –

1

डेटासेट के लिए XSLT परिवर्तन लागू करें: (MSDN से) (मेरा मानना ​​है कि आप दिनांक समय प्रारूप कन्वर्ट करने के लिए XSLT उदाहरण मिल जाएगा, या post on SO regarding XSLT and DateTIme formats देख)

DataSet custDS = new DataSet("CustomerDataSet"); 
XmlDataDocument xmlDoc = new XmlDataDocument(custDS); 

XslTransform xslTran = new XslTransform(); 
xslTran.Load("transform.xsl"); 

XmlTextWriter writer = new XmlTextWriter("xslt_output.html", 
    System.Text.Encoding.UTF8); 

xslTran.Transform(xmlDoc, null, writer); 
writer.Close(); 
+0

हम वास्तव में पहले से ही (तीसरे पक्ष प्रणाली के साथ एकीकरण के लिए) के बाद एक्सएसएलटी के माध्यम से इसे बदल रहे हैं, लेकिन आउटपुट प्रारूप में एएम/पीएम के बारे में परवाह है, इसलिए अब हम केवल 24-घंटा की तारीख को पार्स करने के लिए सशर्त एक्सएसएलटी तर्क लिख रहे हैं प्रारूपित करें और इसे 12-घंटा AM/PM प्रारूप में बदल दें। गन्दा की तरह लेकिन यह चाल करेगा। –

11

यह कामकाज शायद उपयुक्त हो सकता है यदि आप केवल टाइमज़ोन जानकारी को छीनने के साथ रह सकते हैं। डेटासेट में डेटटाइम कॉलम की डेटटाइमोडोड संपत्ति के लिए डिफ़ॉल्ट निर्दिष्ट नहीं है। आप स्पष्ट रूप से DateTimeMode को निर्दिष्ट नहीं कर सकते हैं, जिसका अर्थ है कि टाइमज़ोन भाग को क्रमबद्ध नहीं किया जाता है।

उदा।

आप इस प्रकार का समारोह का उपयोग कर सकते हैं:

DataSet ds = new DataSet(); 
    DataTable dt = new DataTable("t1"); 
    dt.Columns.Add("ID", typeof(int)); 
    dt.Columns.Add("DT", typeof(DateTime)); 
    dt.Rows.Add(new object[] { 1, new DateTime(2009, 1, 1) }); 
    dt.Rows.Add(new object[] { 2, new DateTime(2010, 12, 23) }); 

    ds.Tables.Add(dt); 

    ds.WriteXml("c:\\Standard.xml"); 

    RemoveTimezoneForDataSet(ds); 

    ds.WriteXml("c:\\WithoutTimezone.xml"); 

आउटपुट::

Standard.xml:

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <t1> 
    <ID>1</ID> 
    <DT>2009-01-01T00:00:00+11:00</DT> 
    </t1> 
    <t1> 
    <ID>2</ID> 
    <DT>2010-12-23T00:00:00+11:00</DT> 
    </t1> 
</NewDataSet> 

WithoutTimezone.xml

public static void RemoveTimezoneForDataSet(DataSet ds) 
    { 
     foreach (DataTable dt in ds.Tables) 
     { 
      foreach (DataColumn dc in dt.Columns) 
      { 

       if (dc.DataType == typeof(DateTime)) 
       { 
        dc.DateTimeMode = DataSetDateTime.Unspecified; 
       } 
      } 
     } 
    } 

उपयोग के उदाहरण :

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <t1> 
    <ID>1</ID> 
    <DT>2009-01-01T00:00:00</DT> 
    </t1> 
    <t1> 
    <ID>2</ID> 
    <DT>2010-12-23T00:00:00</DT> 
    </t1> 
</NewDataSet> 

यदि आपको अपने मूल डेटासेट के डेटा कॉलम को संशोधित करने का विचार पसंद नहीं है, तो आप इसकी प्रतिलिपि बना सकते हैं, फिर प्रतिलिपि पर प्रतिलिपि बना सकते हैं।

+0

उत्कृष्ट। धन्यवाद। यह केवल DataSetDateTime प्रतीत होता है। निर्दिष्ट नहीं किया जाएगा क्योंकि मुझे स्थानीय समय का उपयोग करने का प्रयास करने में त्रुटि संदेश मिलता है - तालिका में पहले से डेटा होने पर मोड को बदला नहीं जा सकता है। –

-1

यदि फ़ाइल नियमित है, और निर्यात किया गया एक्सएमएल ऐसा लगता है, तो आप इसे सरल लूप का उपयोग करके पुनः लिख सकते हैं। आसान और त्वरित समाधान।मेरी कोड के कुछ का उपयोग करें यदि आप चाहते हैं:

private void rewriteXML(string oldFile, string newFile, int startPos, int strLength) 
     { 
      try 
      { 
       File.Delete(newFile); 
      } 
      catch { Console.WriteLine("File didn't existed."); } 
      StreamReader SR = new StreamReader(oldFile); 
      string data; 
      StreamWriter SW = new StreamWriter(newFile); 
      while ((data = SR.ReadLine()) != null) 
      { 
       if (data.Contains("<start>")) 
       { 
        string ln_tmp = data.Replace(" ", ""); 
        string newline = " <start>" + ln_tmp.Substring(startPos, strLength) + "</start>"; 
        SW.WriteLine(newline); 
       } 
       else 
        SW.WriteLine(data); 
      } 
      SR.Close(); 
      SW.Close(); 
     } 

उत्पादन की तरह है:

<start>19:34</start> 

के बजाय:

<start>2013-03-17T19:34:00+01:00</start> 
+0

कोड 'उपयोग करने वाले' ब्लॉक को लागू नहीं करता है, और कोशिश/पकड़ने वाला ब्लॉक फ़ाइल नहीं मिला के अलावा अपवाद छुपाएगा। –