You need to enable JavaScript to run this app. Unity C# 用foreach循环实现XML同Type多数据集归集至单文件
优惠活动
大模型
产品
解决方案
定价
更多

Unity C# 用foreach循环实现XML同Type多数据集归集至单文件

问题根因

现有代码的核心缺陷是文件创建、序号生成的操作被嵌套在遍历单个Feldsatz数据集的foreach循环内部,每匹配到一个数据集就触发一次独立文件创建流程,导致同Type下的数据集被拆分成带序号的多个独立文件,没有实现跨数据集的内容归集。

实现方案

核心思路是将「遍历匹配节点、归集内容」和「写入输出文件」两个流程完全解耦,不要边遍历边写文件:

  • 按目标Type值(ftProtect、ftWarn、ftWarn2)提前初始化独立的内存存储容器,为每个Type绑定对应的最终输出文件路径,遍历全程只在内存中做内容归集,不触发任何磁盘IO操作。
  • 遍历XML所有带Type属性的目标节点时,匹配Name为Feldsatz1、Feldsatz2的数据集内容,追加到对应Type的内存存储容器中。
  • 等XML全量遍历完成、所有匹配数据集都归集到对应Type的容器后,再统一为每个Type写入一次对应输出文件,完全移除循环内的序号生成、独立文件创建逻辑。
关键代码参考
// 初始化三类Type对应的内容存储与Unity工程下的输出路径
var typeContentMap = new Dictionary<string, (StringBuilder content, string savePath)>
{
    {"ftProtect", (new StringBuilder(), $"{Application.dataPath}/output_ftProtect.xml")},
    {"ftWarn", (new StringBuilder(), $"{Application.dataPath}/output_ftWarn.xml")},
    {"ftWarn2", (new StringBuilder(), $"{Application.dataPath}/output_ftWarn2.xml")}
};

// 全量遍历XML节点做内容归集
var allNodes = xmlDocument.SelectNodes("//*[@Type]");
foreach (XmlNode node in allNodes)
{
    string currentType = node.Attributes["Type"].Value;
    // 跳过非目标Type的节点
    if (!typeContentMap.ContainsKey(currentType)) continue;
    
    // 匹配当前节点下所有目标Feldsatz数据集
    var feldNodes = node.SelectNodes(".//*[@Name='Feldsatz1' or @Name='Feldsatz2']");
    foreach (XmlNode feldNode in feldNodes)
    {
        // 将数据集内容追加到对应Type的内存容器
        typeContentMap[currentType].content.Append(feldNode.OuterXml);
    }
}

// 遍历完全结束后,统一执行文件写入
foreach (var item in typeContentMap)
{
    File.WriteAllText(item.Value.savePath, item.Value.content.ToString());
}
避坑提示
  • 严禁在foreach遍历Feldsatz节点的循环内部执行File.Create()、new FileStream()、拼接带序号的文件名这类操作,这类操作必须全部移到循环外部。
  • 如果需要输出标准XML格式的合并结果,不要直接拼接节点字符串,建议为每个Type初始化独立的XmlDocument对象,将匹配到的Feldsatz节点作为子节点导入对应文档的根节点下,最后整体序列化输出,避免出现格式不合法的问题。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 20:06:09