DataSet.WriteXml 直接輸出的日期時間與數值格式固定,無法符合特定呈現需求(如中文日期格式、貨幣符號)。解決方案:使用 XmlTextReader/XmlTextWriter 逐節點轉寫,配合 XmlConvert 進行型別轉換與格式化。
private void btnWriteDataSetToXml_Click(object sender, EventArgs e) {
string xmlPath = @"C:\DataSetOutputXml.xml";
try {
using (XmlTextReader reader = new XmlTextReader(ds.GetXml(), XmlNodeType.Element, null))
using (XmlTextWriter writer = new XmlTextWriter(xmlPath, Encoding.UTF8)) {
writer.Formatting = Formatting.Indented;
writer.Indentation = 4;
writer.WriteStartDocument();
string currentElement = "";
while (reader.Read()) {
switch (reader.NodeType) {
case XmlNodeType.Element:
writer.WriteStartElement(reader.Name);
currentElement = reader.Name;
break;
case XmlNodeType.Text:
switch (currentElement.ToLower()) {
case "出生日期":
// 自訂完整中文日期格式
writer.WriteString(
XmlConvert.ToDateTime(reader.Value, XmlDateTimeSerializationMode.Local)
.ToString("yyyy 年 MMMM dd 號 dddd,時間 HH 點 mm 分 ss 秒"));
break;
case "雇用日期":
case "加薪日期":
// 短日期格式
writer.WriteString(
XmlConvert.ToDateTime(reader.Value, XmlDateTimeSerializationMode.Local)
.ToString("d"));
break;
case "起薪":
case "目前薪資":
// 貨幣格式
writer.WriteString(
XmlConvert.ToDecimal(reader.Value).ToString("c"));
break;
default:
writer.WriteString(reader.Value);
break;
}
break;
case XmlNodeType.EndElement:
writer.WriteEndElement();
break;
}
}
}
txtXmlResult.Text = File.ReadAllText(xmlPath);
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
}
輸出 XML 中日期欄位顯示為「2008 年 January 15 號 Tuesday,時間 08 點 30 分 00 秒」,薪資欄位顯示為「$45,000.00」等本地化格式。
另可先輸出標準 XML,再套用 XSLT 樣式表轉換格式,適合複雜或可重複使用的格式化邏輯。
XmlConvert:提供符合 XML Schema 標準的型別轉換(ToDateTime、ToDecimal 等)。XmlTextWriter:控制縮排、編碼、元素寫入。XmlDateTimeSerializationMode:指定時區處理模式(Local/Utc/Unspecified)。