C# foreach循环写入XML文件仅保留最后一行数据的问题咨询
问题根源
你当前的代码存在两个核心错误:
- 把
XmlTextWriter实例创建、XML文档头写入、根节点创建/关闭、文件保存的逻辑全放在了foreach循环内部,每遍历一行CSV就会重新创建并覆盖原输出文件,之前写入的内容会被直接清空,最终自然只会保留最后一行的转换结果 - 没有跳过CSV的第一行表头,直接解析表头行还会出现数据错位或索引异常
修正后代码
// 读取所有CSV行 var lines = File.ReadAllLines(path); // 把XmlTextWriter的初始化放在循环外,全程只创建一次输出文件 using (XmlTextWriter writer = new XmlTextWriter(savepath, Encoding.UTF8)) { // 写入文档头、根节点,仅执行一次 writer.WriteStartDocument(); writer.Formatting = Formatting.Indented; // 可选配置,让生成的XML自动缩进更易读 writer.WriteStartElement("DC8_Recipes"); // 遍历行,跳过索引0的表头行,从第二行(索引1)开始处理数据 for (int i = 1; i < lines.Length; i++) { var csvItem = lines[i].Split(';'); // 格式校验,防止行拆分后元素不够导致索引越界 if (csvItem.Length < 13) continue; // 写入单条数据节点 writer.WriteStartElement("DC8_Recipes"); writer.WriteAttributeString("PlantNo", csvItem[1]); writer.WriteAttributeString("No", csvItem[2]); writer.WriteAttributeString("Name", csvItem[3]); writer.WriteStartElement("RecipeSetValueRow"); writer.WriteAttributeString("SetValue", csvItem[12]); writer.WriteAttributeString("EnumSetValueRowUnit", csvItem[11]); writer.WriteStartElement("Material"); writer.WriteAttributeString("No", csvItem[10]); writer.WriteEndElement(); // Material节点结束 writer.WriteEndElement(); // RecipeSetValueRow节点结束 writer.WriteEndElement(); // 单条DC8_Recipes节点结束 } // 关闭根节点、文档,仅执行一次 writer.WriteEndElement(); // 根节点DC8_Recipes结束 writer.WriteEndDocument(); } // using语法会自动释放writer资源,不需要手动调用Close()
额外优化建议
- 若CSV字段中存在包含
;的转义内容,不要直接用Split拆分,建议使用专用的CSV解析组件处理 - 可以对提取的CSV字段做非空、格式校验,避免写入无效的XML属性值
内容的提问来源于stack exchange,提问作者Andrea Ruffo
相关产品推荐
相关产品推荐

