在C#开发中,DataTable是常用的内存数据容器,将DataTable导出为XML格式可以满足数据交换、本地存储等多种需求,C#本身提供了成熟的API支持这个操作,不需要引入第三方库就能实现。

方法一:直接使用DataTable的WriteXml方法
DataTable类自带WriteXml方法,可以直接将自身的数据写入到XML文件或者流中,这是最简洁的导出方式,适合只需要导出单个DataTable的场景。
基础导出示例
下面的代码演示了如何将内存中的DataTable导出到指定路径的XML文件:
using System;
using System.Data;
namespace DataTableToXmlDemo
{
class Program
{
static void Main(string[] args)
{
// 创建测试DataTable
DataTable dt = new DataTable("UserTable");
// 添加列
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Age", typeof(int));
// 添加测试数据
dt.Rows.Add(1, "张三", 25);
dt.Rows.Add(2, "李四", 30);
dt.Rows.Add(3, "王五", 28);
// 定义导出文件路径
string xmlPath = "D:\user_data.xml";
// 调用WriteXml方法导出
dt.WriteXml(xmlPath);
Console.WriteLine("DataTable导出XML完成,文件路径:" + xmlPath);
}
}
}
WriteXml方法的常用重载
WriteXml有多个重载版本,可以根据需求选择不同的参数:
- 传入字符串路径:直接将XML写入指定路径的文件
- 传入
Stream对象:可以将XML写入内存流、文件流等,方便后续处理 - 传入
XmlWriteMode枚举:可以指定导出的XML模式,比如是否包含架构信息
包含架构信息的导出
如果需要导出时同时包含DataTable的架构信息(列名、数据类型等),可以使用XmlWriteMode.WriteSchema参数:
// 导出时包含架构信息
dt.WriteXml("D:\user_data_with_schema.xml", XmlWriteMode.WriteSchema);
方法二:通过DataSet间接导出
如果需要导出多个DataTable,或者需要更灵活的控制XML的结构,可以先将DataTable放入DataSet中,再调用DataSet的WriteXml方法导出。
实现示例
using System;
using System.Data;
namespace DataSetExportXmlDemo
{
class Program
{
static void Main(string[] args)
{
// 创建第一个DataTable
DataTable userDt = new DataTable("User");
userDt.Columns.Add("UserId", typeof(int));
userDt.Columns.Add("UserName", typeof(string));
userDt.Rows.Add(1, "张三");
userDt.Rows.Add(2, "李四");
// 创建第二个DataTable
DataTable orderDt = new DataTable("Order");
orderDt.Columns.Add("OrderId", typeof(int));
orderDt.Columns.Add("UserId", typeof(int));
orderDt.Columns.Add("OrderPrice", typeof(decimal));
orderDt.Rows.Add(1001, 1, 199.9m);
orderDt.Rows.Add(1002, 2, 299.5m);
// 创建DataSet并添加两个DataTable
DataSet ds = new DataSet("UserOrderDataSet");
ds.Tables.Add(userDt);
ds.Tables.Add(orderDt);
// 导出DataSet为XML
ds.WriteXml("D:\user_order_data.xml");
Console.WriteLine("DataSet导出XML完成");
}
}
}
导出时的注意事项
编码设置
默认导出的XML编码是UTF-8,如果需要指定其他编码,可以通过StreamWriter来间接实现:
using System;
using System.Data;
using System.IO;
using System.Text;
namespace XmlEncodingDemo
{
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable("TestTable");
dt.Columns.Add("Col1", typeof(string));
dt.Rows.Add("测试内容");
// 使用StreamWriter指定编码为GB2312
using (StreamWriter writer = new StreamWriter("D:\test_gb2312.xml", false, Encoding.GetEncoding("GB2312")))
{
dt.WriteXml(writer);
}
}
}
}
空值处理
DataTable中的DBNull.Value值在导出为XML时,对应节点会为空,如果需要自定义空值的显示方式,可以在导出前先处理DataTable的数据,将空值替换为指定的默认值。
文件路径权限
导出时如果指定的路径没有写入权限,会抛出UnauthorizedAccessException异常,开发时需要注意目标路径的权限设置,或者提前做好异常捕获处理。
两种方法的适用场景
| 方法 | 适用场景 |
|---|---|
| DataTable.WriteXml | 只需要导出单个DataTable,需求简单,追求代码简洁 |
| DataSet.WriteXml | 需要导出多个DataTable,或者需要自定义XML的顶层结构,需要更灵活的控制 |
总结
C#中导出DataTable为XML格式的操作非常简单,核心就是利用WriteXml方法。如果是单个DataTable直接调用即可,多个DataTable则通过DataSet中转。实际开发中可以根据需求选择是否包含架构信息、设置对应的编码,同时注意处理可能出现的异常,就能稳定完成导出需求。