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规范要求:字段含逗号、双引号或换行符时,必须用双引号包裹;字段内已有双引号需转义为两个双引号(" → ""):
- 封装一个辅助方法,如
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(""", """")}""; }