Пользовательские форматы DateTime при использовании DataSet.WriteXml в .NET - PullRequest
7 голосов
/ 03 августа 2011

У меня проблема с записью DataSet в XML со столбцом типа DateTime, и я хочу управлять форматом вывода.

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

По умолчанию формат DateTime вXML выглядит следующим образом:

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

Я бы хотел использовать пользовательский формат даты или, по крайней мере, удалить информацию о часовом поясе.

Есть ли способ контролироватьформат столбцов DateTime в моем наборе данных XML?

Моя интуиция говорит «нет», так как я предполагаю, что это сделано таким образом, чтобы упростить преобразование данных по часовым поясам, но я заметил, что могу успешно читать XML DataSet, даже если теги столбца DateTime опускают данные часового пояса, поэтому янадеялся, что смогу сделать что-то аналогичное при записи в XML.

Ответы [ 4 ]

11 голосов
/ 04 августа 2011

Этот обходной путь может подойти, если вы можете жить, просто удаляя информацию о часовом поясе.Значением по умолчанию для свойства DateTimeMode столбцов DateTime в DataSets является UnspecifiedLocal.Вы можете явно установить DateTimeMode в Unspecified, что означает, что часть часового пояса не сериализуется.

например,

Вы можете использовать такую ​​функцию:

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

Пример использования:

    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:

<?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>

Если вам не нравится идея изменения столбцов DataColumns исходного набора данных, вы можете сделать копиюзатем вызовите функцию для копии.

1 голос
/ 03 августа 2011

Применение преобразования XSLT к DataSet: (из MSDN ) (Я полагаю, вы найдете пример XSLT для преобразования формата DateTime или посмотрите сообщение на SO, касающееся форматов XSLT и DateTIme )

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 голосов
/ 23 марта 2013

Если файл обычный и экспортированный XML выглядит так, вы можете просто переписать его, используя простой цикл.Простое и быстрое решение.Используйте часть моего кода, если хотите:

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 голосов
/ 03 августа 2011

Существует один стандартный формат для DateTime в XML.Это формат, который будет использовать WriteXml.Если вам нужен другой формат, вам не нужно использовать DateTime.Как уже говорили другие, используйте String вместо.

...