C#如何将XML数据导出为CSV文件

12次阅读

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

C#如何将XML数据导出为CSV文件

在C#中将XML数据导出为csv文件,核心是先解析XML(获取结构化数据),再按CSV格式逐行写入文本。关键在于处理字段分隔、特殊字符(如逗号、换行、引号)的转义,以及保持列对齐和编码正确。

解析XML并提取数据

使用 XmlDocument 或更推荐的 XDocumentlinq to XML)读取XML。若XML有固定结构(如A25),可直接投影为对象列表或匿名类型:

  • XDocument.Load("data.xml") 加载文件
  • doc.Root.Elements("Record") 获取所有记录节点
  • 对每个节点,用 element.Element("Name")?.Value 提取字段值
  • 建议统一存入 List> 或自定义类集合,便于后续写入

生成合规的CSV行内容

CSV规范要求:字段含逗号、双引号或换行符时,必须用双引号包裹;字段内已有双引号需转义为两个双引号("""):

  • 封装一个辅助方法,如 EscapeCsvField(String value)
  • 逻辑:若字符串为空或含 ,"nr,则用双引号包裹,并将内部 " 替换为 ""
  • 例如:"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(""", """")}""; }

text=ZqhQzanResources