我遇到了一个问题,我正在将一个DataSet写入一个具有DateTime类型列的XML,我想控制输出格式。
DataSet data = LoadDataSet();
data.Tables[0].Rows[0]["MyDate"] = DateTime.Now;
data.WriteXml(myFile);
默认情况下,XML中DateTime的格式如下所示:
2011-08-02T17:39:00-07:00
我想使用自定义日期格式,或者至少删除时区信息。
有没有办法控制数据集XML中DateTime列的格式?
我的直觉说不,因为我假设它是以这种方式完成的,以便于跨时区转换数据,但我注意到即使DateTime列标签省略了时区数据,我也能成功读取DataSet XML,所以我希望我在写入XML时可以做类似的事情。
答案 0 :(得分:11)
这种解决方法可能适用于您只能将时区信息删除。 DataSet中DateTime列的DateTimeMode属性的默认值为UnspecifiedLocal。您可以将DateTimeMode显式设置为Unspecified,这意味着时区部分不会被序列化。
e.g。
您可以使用以下功能:
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>
如果您不喜欢修改原始DataSet的DataColumns的想法,可以复制它,然后在副本上调用该函数。
答案 1 :(得分:1)
将XSLT转换应用于DataSet :(来自MSDN) (我相信你会找到转换DateTime格式的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();
答案 2 :(得分:0)
将datatime转换为字符串的肮脏但简单的解决方案:
select concat(datetime_field,'') datetime_field from table_name
答案 3 :(得分:-1)
XML中DateTime
有一种标准格式。这是WriteXml
将使用的格式。如果您需要不同的格式,则无需使用DateTime
。正如其他人所说,请改用String
。
答案 4 :(得分:-1)
如果文件是常规的,并且导出的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>