在C#开发中,DataTable是常用的内存数据容器,将其中存储的数据导出为XML格式是很多业务场景下的常见需求,比如数据备份、跨平台数据传递等。下面介绍两种主流的实现方式。

方案一:使用DataTable自带的WriteXml方法
DataTable类本身提供了WriteXml方法,可以直接将表中的数据序列化为XML格式并写入指定路径的文件,这种方式实现简单,不需要手动处理XML节点结构。
首先我们需要先构建一个测试用的DataTable,填充一些示例数据:
using System;
using System.Data;
class Program
{
static void Main()
{
// 创建DataTable并定义列结构
DataTable dt = new DataTable("UserInfo");
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("UserName", typeof(string));
dt.Columns.Add("Age", typeof(int));
dt.Columns.Add("RegisterTime", typeof(DateTime));
// 填充测试数据
dt.Rows.Add(1, "张三", 25, DateTime.Now.AddDays(-10));
dt.Rows.Add(2, "李四", 28, DateTime.Now.AddDays(-5));
dt.Rows.Add(3, "王五", 22, DateTime.Now.AddDays(-2));
// 调用WriteXml方法导出为XML文件
string filePath = "D:\user_data.xml";
dt.WriteXml(filePath, XmlWriteMode.WriteSchema);
Console.WriteLine("XML文件导出完成,路径:" + filePath);
}
}
上述代码中,WriteXml方法的第二个参数指定了导出模式,XmlWriteMode.WriteSchema表示导出的XML会包含DataTable的结构信息(列名、数据类型等),如果只需要导出数据内容,可以使用XmlWriteMode.IgnoreSchema。
方案二:手动构建XML结构导出
如果需要对导出的XML格式做自定义调整,比如修改节点名称、过滤特定列数据,就可以选择手动构建XML结构的方式,通过XmlDocument或者XDocument来生成XML内容。
下面是使用XDocument实现的示例:
using System;
using System.Data;
using System.Xml.Linq;
class Program
{
static void Main()
{
// 创建并填充测试DataTable
DataTable dt = new DataTable("Product");
dt.Columns.Add("ProductId", typeof(int));
dt.Columns.Add("ProductName", typeof(string));
dt.Columns.Add("Price", typeof(decimal));
dt.Rows.Add(101, "笔记本电脑", 4999.00m);
dt.Rows.Add(102, "无线鼠标", 89.00m);
dt.Rows.Add(103, "机械键盘", 299.00m);
// 创建XML根节点
XElement root = new XElement("ProductList");
// 遍历DataTable的行,构建子节点
foreach (DataRow row in dt.Rows)
{
XElement productNode = new XElement("Product",
new XElement("Id", row["ProductId"]),
new XElement("Name", row["ProductName"]),
new XElement("Price", row["Price"])
);
root.Add(productNode);
}
// 生成XDocument并保存到文件
XDocument doc = new XDocument(
new XDeclaration("1.0", "utf-8", "yes"),
root
);
string filePath = "D:\product_data.xml";
doc.Save(filePath);
Console.WriteLine("自定义XML文件导出完成,路径:" + filePath);
}
}
这种方式可以灵活控制XML的节点层级和命名,适合对XML格式有特殊要求的场景。
两种方案对比
| 对比项 | WriteXml方法 | 手动构建XML |
|---|---|---|
| 实现复杂度 | 低,一行代码即可完成 | 较高,需要手动处理节点逻辑 |
| 格式灵活性 | 低,只能使用默认或简单的导出模式 | 高,可完全自定义节点结构 |
| 适用场景 | 快速导出、无格式特殊要求 | 需要自定义XML结构、过滤数据 |
注意事项
- 导出路径需要确保目录存在,否则会抛出文件找不到的异常,可以在导出前先判断目录是否存在,不存在则创建。
- 如果DataTable中包含特殊字符,比如
<、>、&等,WriteXml方法会自动进行转义,手动构建时需要注意对这些字符做处理,避免生成非法XML。 - 导出时建议指定编码格式为UTF-8,避免中文出现乱码问题,手动构建XML时可以通过
XDeclaration指定编码。
如果导出的XML需要被其他系统解析,建议提前和对接方确认XML的节点规范,再选择合适的导出方案。