You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# XmlSerializer序列化XML时子元素前缺失换行格式异常如何解决

问题根因

当前序列化配置没有强制约束元素换行规则,同时未对齐原始XML的缩进规格,导致相邻元素被合并到同一行、子节点缩进错位:

  1. XmlWriter默认不会强制每个元素的起始标签单独换行,相邻空元素会自动拼接
  2. 未显式指定缩进字符,不同运行环境的默认缩进规则可能和原始XML的2空格缩进不一致
  3. 如果子元素包含内嵌文本节点,默认序列化不会自动对齐文本的缩进层级

修复方案

调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 01:33:04