C# XmlSerializer序列化XML时子元素前缺失换行格式异常如何解决
问题根因
当前序列化配置没有强制约束元素换行规则,同时未对齐原始XML的缩进规格,导致相邻元素被合并到同一行、子节点缩进错位:
- XmlWriter默认不会强制每个元素的起始标签单独换行,相邻空元素会自动拼接
- 未显式指定缩进字符,不同运行环境的默认缩进规则可能和原始XML的2空格缩进不一致
- 如果子元素包含内嵌文本节点,默认序列化不会自动对齐文本的缩进层级
修复方案
调整XmlWriterSettings配置,补充强制换行、对齐缩进规格即可,修改后的代码如下:
public static string Serialize<T>(T dataToSerialize) { var ns = new XmlSerializerNamespaces(); ns.Add("", ""); var serializer = new XmlSerializer(dataToSerialize.GetType()); var settings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true, NewLineChars = "\n", NewLineHandling = NewLineHandling.Replace, // 新增核心配置 NewLineOnElements = true, // 强制所有元素的起始标签单独占一行 IndentChars = " ", // 对齐原始XML的2空格缩进规则 CloseOutput = true }; using (var stream = new StringWriter()) using (var writer = XmlWriter.Create(stream, settings)) { serializer.Serialize(writer, dataToSerialize, ns); writer.Flush(); // 强制刷新缓冲区,避免遗漏内容 return stream.ToString(); } }
兼容适配
如果你的运行环境版本较低,不支持NewLineOnElements属性,可以在序列化完成后通过简单的字符串替换手动补全换行:
// 序列化完成后执行,注意替换规则要匹配你的缩进规格 var result = stream.ToString().Replace("><", ">\n <");
如果子元素内部文本仍存在缩进错位,可以在读取原始XML时设置XmlReaderSettings.IgnoreWhitespace = false,保留原始的空白、换行信息,避免序列化时丢失格式上下文。
内容的提问来源于stack exchange,提问作者dotnetdevcsharp
相关产品推荐
相关产品推荐

