

新闻资讯
技术百科C#中导出XML为CSV需先用XDocument解析XML提取数据,再按CSV规范转义字段(含逗号、引号、换行符时加双引号并转义引号),最后用StreamWriter以UTF-8 with BOM编码写入文件,首行为列头,每行用Environment.NewLine换行。
在C#中将XML数据导出为CSV文件,核心是先解析XML(获取结构化数据),再按CSV格式逐行写入文本。关键在于处理字段分隔、特殊字符(如逗号、换行、引号)的转义,以及保持列对齐和编码正确。
使用 XmlDocument 或更推荐的 XDocument(LINQ to XML)读取XML。若XML有固定结构(如),可直接投影为对象列表或匿名类型:
XDocument.Load("data.xml") 加载文件doc.Root.Elements("Record") 获取所有记录节点element.Element("Name")?.Value 提取字段值List> 或自定义类集合,便于后续写入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)));
// 写数据行
forea
ch (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("\"", "\"\"")}\"";
}