C#中导出XML为CSV需先用XDocument解析XML提取数据,再按CSV规范转义字段(含逗号、引号、换行符时加双引号并转义引号),最后用StreamWriter以UTF-8 with BOM编码写入文件,首行为列头,每行用Environment.NewLine换行。

在C#中将XML数据导出为CSV文件,核心是先解析XML(获取结构化数据),再按CSV格式逐行写入文本。关键在于处理字段分隔、特殊字符(如逗号、换行、引号)的转义,以及保持列对齐和编码正确。
解析XML并提取数据
使用 XmlDocument 或更推荐的 XDocument(LINQ to XML)读取XML。若XML有固定结构(如),可直接投影为对象列表或匿名类型:
- 用
XDocument.Load("data.xml")加载文件 - 用
doc.Root.Elements("Record")获取所有记录节点 - 对每个节点,用
element.Element("Name")?.Value提取字段值 - 建议统一存入
List或自定义类集合,便于后续写入>
生成合规的CSV行内容
CSV规范要求:字段含逗号、双引号或换行符时,必须用双引号包裹;字段内已有双引号需转义为两个双引号(" → ""):
拍客竞拍系统是一款免费竞拍网站建设软件,任何个人可以下载使用,但未经商业授权不能进行商业活动,程序源代码开源,任何个人和企业可以进行二次开发,但不能以出售和盈利为目的。安装方法,将www文件夹里面的所有文件上传至虚拟主机,在浏览器执行http://你的域名/install.php或者直接导入数据库文件执行。本次升级优化了一下内容1,程序和模板完美分离。2,优化了安装文件。3,后台增加模板切换功能。
- 封装一个辅助方法,如
EscapeCsvField(string value) - 逻辑:若字符串为空或含
,、"、\n、\r,则用双引号包裹,并将内部"替换为"" - 例如:
"John \"Smith\""→"John ""Smith""" - 首行写入列头(如
"Name","Age","City"),注意同样需转义
写入文件并处理编码与换行
使用 StreamWriter 写入,显式指定编码(推荐 UTF-8 with BOM,确保Excel能正确识别中文):
- 构造
new StreamWriter("output.csv", false, Encoding.UTF8) - 手动写入
Encoding.UTF8.GetPreamble()(BOM头),或用new StreamWriter(..., true)并设置.AutoFlush = true - 每行结尾用
Environment.NewLine(兼容Windows/Linux) - 避免用
File.WriteAllLines,它不支持BOM且换行符固定为\n
完整示例(简洁可用)
以下代码片段可直接运行(假设有 data.xml 文件):
var doc = XDocument.Load("data.xml");
var records = doc.Root?.Elements("Record")
.Select(x => new {
Name = x.Element("Name")?.Value ?? "",
Age = x.Element("Age")?.Value ?? "",
City = x.Element("City")?.Value ?? ""
}).ToList();
using var writer = new StreamWriter("output.csv", false, Encoding.UTF8);
// 写BOM
writer.BaseStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length);
// 写表头
writer.WriteLine(string.Join(",", new[] { "Name", "Age", "City" }.Select(EscapeCsvField)));
// 写数据行
foreach (var r in records) {
writer.WriteLine(string.Join(",", new[] { r.Name, r.Age, r.City }.Select(EscapeCsvField)));
}
string EscapeCsvField(string s) {
if (string.IsNullOrEmpty(s) || !s.ContainsAny(',', '"', '\n', '\r')) return s;
return $"\"{s.Replace("\"", "\"\"")}\"";
}









