XElement存储\n后保存为文件/流变为\r\n的行为解析请求
XElement保存时将\n转为\r\n的行为解释
核心原因:XML的换行归一化与序列化适配
这是XML处理栈的标准化行为,分两步理解:
- XML解析的归一化规则:根据XML 1.0规范,解析器会将文本内容中的
\r\n、单独的\r统一转换为\n。这就是为什么你读取XML时,返回的文本还是\n——不管文件里存的是\r\n还是\n,解析后都会归一化处理。 - XmlWriter的序列化适配:XElement的
Save方法内部依赖XmlWriter完成输出,而XmlWriter默认会将文本节点中的\n转换为当前平台的换行符序列(Windows下就是\r\n)。这是为了让生成的XML文件符合当前系统的换行习惯,提升文件可读性。
你的代码逻辑验证
在你的代码流程里:
- 你把文本中的
Environment.NewLine(Windows下为\r\n)替换成\n存入XElement; - 调用
Save时,XmlWriter自动把\n转为Windows平台的\r\n写入流; - 读取时,XML解析器又把流里的
\r\n归一化回\n,所以最终xmlTarget.Value和你最初存入的内容完全一致。
如何强制输出\n(可选)
如果需要让保存的XML文件里直接保留\n而不转换为\r\n,可以手动配置XmlWriterSettings指定换行规则:
using System.Xml.Linq; using System.Xml; var text = "Test1" + Environment.NewLine + "Test2" + Environment.NewLine + "Test3"; using MemoryStream stream = new(); var xmlSource = new XElement("Data", text.Replace(Environment.NewLine, "\n")); // 配置XmlWriter强制输出\n var settings = new XmlWriterSettings { NewLineChars = "\n", NewLineHandling = NewLineHandling.None, Indent = false // 保持和原代码一致的无缩进输出 }; using var writer = XmlWriter.Create(stream, settings); xmlSource.Save(writer); stream.Position = 0; var xmlTarget = XElement.Load(stream); Console.WriteLine(xmlTarget.Value);
这样写入流的内容就会保留原始的\n,不会被转换为平台特定的换行符。
内容的提问来源于stack exchange,提问作者msedi
相关产品推荐
相关产品推荐

