You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 12:45:04