xmlwriter.create 必须显式配置 xmlwritersettings 并设置 indent=true、indentchars(如" ")和 newlinechars(如"\r\n")才能启用缩进,缺一不可;否则输出为无格式单行。

XmlWriter.Create 时必须用 XmlWriterSettings 才能控制缩进
默认的 XmlWriter.Create(string) 返回的是不带格式化的写入器,哪怕 XML 内容本身有换行或空格,输出也是一整行。缩进和换行不是“自动生效”的样式开关,而是需要显式配置 XmlWriterSettings 并传进去。
-
XmlWriterSettings必须 new 出来,设好Indent= true,再设IndentChars(比如" "或"\t"),否则缩进无效 -
NewLineChars控制换行符("\r\n"或"\n"),但只有Indent= true 时才起作用;单独设NewLineChars不会换行 - 别用
XmlWriter.Create(Stream, null)—— 第二个参数为null就等于放弃所有设置,退化成默认无格式行为
IndentChars 和 NewLineChars 的实际影响差异
IndentChars 定义每级缩进用什么字符、几个——它只在元素开始标签、结束标签、文本节点前后插入;NewLineChars 则决定这些插入点之间用什么换行符分隔。两者配合才出“可读格式”,缺一不可。
- Windows 下建议设
NewLineChars = "\r\n",否则某些编辑器或调试器里换行显示异常 -
IndentChars = " "(两个空格)比"\t"更稳妥:有些 XML 解析器对制表符敏感,且 IDE 显示宽度不一致 - 如果输出要被其他系统消费(比如 Java 服务),优先用空格缩进 +
\n换行,兼容性更高
常见错误:写了 Indent = true 却没缩进
最常踩的坑是漏掉 IndentChars 设置。.NET 默认 IndentChars 是 " "(两个空格),但如果你手动 new 了 XmlWriterSettings 又没赋值,它的 IndentChars 是 null,此时即使 Indent = true,也不输出任何缩进字符。
- 错误写法:
var settings = new XmlWriterSettings { Indent = true };→IndentChars为null,无缩进 - 正确写法:
var settings = new XmlWriterSettings { Indent = true, IndentChars = " " }; - 验证方法:写一个简单 XML 后检查输出字符串是否含
" <child>"</child>这类带空格的行,而不是"<child>"</child>紧贴左边界
WriteStartDocument 和 WriteEndDocument 对缩进的影响
WriteStartDocument() 不会触发缩进行为,但它会影响后续第一个元素的缩进层级;而 WriteEndDocument() 之后不能再写内容,否则抛 InvalidOperationException。缩进逻辑只作用于元素结构,不作用于文档声明或注释。
-
WriteStartDocument()后直接WriteStartElement("root"),"<root>"</root>会顶格(第 0 层),子元素才是第一级缩进 - 如果想让
<root></root>也缩进,得手动WriteWhitespace,但通常没必要——标准格式只要求嵌套结构清晰 -
WriteComment("...")不受缩进控制,它原样输出在当前位置,不会自动加空格或换行
XmlWriterSettings 中三个字段协同:必须同时设 Indent、IndentChars、NewLineChars,且不能让其中任一为 null 或空字符串。稍有遗漏,输出就回到原始压缩形态。










