C#控制台可完整显示XML数据,写入文本文件仅显首/末行求解决
解决XML数据无法完整写入文本文件的问题
你遇到的核心问题是:控制台输出是逐行追加显示,但直接写入文件时如果操作不当,会导致内容被覆盖,只留下最后一行(或第一行)。原代码里的Console.WriteLine是不断往控制台缓冲区追加内容,但文件写入如果每次都用覆盖模式,就会把之前的内容清空。
我给你两种实用的解决方案,都能完整把XML的所有节点和属性写入文本文件:
方案一:用StringBuilder收集所有内容再一次性写入
这种方法先把所有要输出的内容都收集到StringBuilder里,最后一次性写入文件,既高效又不会出现覆盖问题:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(path); XmlNode rootNode = xmlDoc.DocumentElement; // 创建StringBuilder来收集所有输出内容 StringBuilder contentBuilder = new StringBuilder(); DisplayNodes(rootNode, contentBuilder); // 一次性写入到文本文件 File.WriteAllText("output.txt", contentBuilder.ToString()); Console.ReadLine(); void DisplayNodes(XmlNode node, StringBuilder builder) { // 写入节点类型、名称或文本值 if (node.NodeType == XmlNodeType.Text) { builder.AppendLine(node.Value.TrimStart()); } else { builder.AppendLine(node.Name.TrimStart()); } // 写入节点属性 if (node.Attributes != null) { foreach (XmlAttribute attr in node.Attributes) { builder.AppendLine($"{attr.Name} {attr.Value}"); builder.AppendLine(); // 保留原有的空行分隔 } } // 递归处理子节点 foreach (XmlNode child in node.ChildNodes) { DisplayNodes(child, builder); } }
优点
StringBuilder是专门用于高效拼接大量字符串的类,比直接用+拼接字符串性能好很多- 只进行一次文件写入操作,减少IO开销
方案二:使用StreamWriter边处理边写入
如果你的XML文件特别大,不想把所有内容都放在内存里,可以用StreamWriter在递归过程中直接写入文件,注意要保持StreamWriter的打开状态,不要每次都重新创建:
XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(path); XmlNode rootNode = xmlDoc.DocumentElement; // 使用using块自动管理StreamWriter的生命周期,避免资源泄漏 using (StreamWriter writer = new StreamWriter("output.txt", false)) { DisplayNodes(rootNode, writer); } Console.ReadLine(); void DisplayNodes(XmlNode node, StreamWriter writer) { // 写入节点信息 if (node.NodeType == XmlNodeType.Text) { writer.WriteLine(node.Value.TrimStart()); } else { writer.WriteLine(node.Name.TrimStart()); } // 写入节点属性 if (node.Attributes != null) { foreach (XmlAttribute attr in node.Attributes) { writer.WriteLine($"{attr.Name} {attr.Value}"); writer.WriteLine(); } } // 递归处理子节点 foreach (XmlNode child in node.ChildNodes) { DisplayNodes(child, writer); } }
注意点
StreamWriter构造函数的第二个参数false表示如果文件已存在就覆盖它,如果需要追加到已有文件末尾,改成true即可using块会自动关闭并释放StreamWriter资源,不用手动调用Close()或Dispose()
这两种方法都能完美复刻你控制台输出的所有内容到文本文件里,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者Rhino
相关产品推荐
相关产品推荐

