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
相关产品推荐
相关产品推荐

