C# XDocument.Save()如何格式化输出

XDocument.Save() 默认不格式化,需用 XmlWriter 配合 XmlWriterSettings(Indent=true、Encoding=UTF8)实现缩进换行;IndentChars 可设空格或 "\t",OmitXmlDeclaration 控制声明输出。

C# 中 XDocument.Save() 默认不带缩进和换行,要实现格式化(美观、可读)输出,关键在于使用 XmlWriter 配合 XmlWriterSettings 来控制格式。

启用缩进和自动换行

直接调用 doc.Save(path) 会生成紧凑 XML(一行式)。必须通过自定义 XmlWriter 启用格式化:

  • 设置 XmlWriterSettings.Indent = true
  • 设置 XmlWriterSettings.NewLineOnAttributes = false(可选,避免属性换行)
  • 推荐设置 Encoding 以保持中文等字符正确(如 UTF-8)

完整示例代码

以下写法可生成带缩进、换行、UTF-8 编码的格式化 XML 文件:

XDocument doc = new XDocument(
    new XElement("Root",
        new XElement("Child", "Content"),
        new XElement("Child", 
            new XAttribute("id", "1"),
            "Another content"
        )
    )
);

var settings = new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8, NewLineOnAttributes = false };

using (var writer = XmlWriter.Create("output.xml", settings)) { doc.Save(writer); }

注意:Save(string) 不格式化

XDocument.Save("file.xml") 内部使用默认 XmlWriterIndentfalse,所以不会缩进。这是常见误区——不能只靠 Save() 方法名判断是否格式化。

如果需要更精细控制(如缩进空格数)

XmlWriterSettings.IndentChars 可指定缩进符号,默认是两个空格。如需 Tab 缩进,设为 "\t"

  • settings.IndentChars = "\t";
  • settings.OmitXmlDeclaration = false;(保留 声明)
  • 若不想要声明,设为 true,但注意这不影响格式化本身