在C#的XML处理场景中,XDocument是常用的文档操作类,调用其Save方法可以将内存中的XML内容写入到文件、流或者文本写入器中。默认情况下,Save方法输出的XML内容是紧凑排列的,所有节点和属性都挤在一行,没有缩进和换行,可读性较差。如果需要对输出内容进行格式化,让XML结构更清晰,就需要通过特定的配置来实现。

XDocument.Save()的默认输出表现
首先我们来看默认情况下的输出效果。创建一个简单的XDocument实例并调用Save方法写入文件,代码如下:
using System;
using System.Xml.Linq;
class Program
{
static void Main()
{
// 创建简单的XML文档
XDocument doc = new XDocument(
new XElement("Root",
new XElement("User",
new XAttribute("Id", "1"),
new XElement("Name", "张三"),
new XElement("Age", "25")
),
new XElement("User",
new XAttribute("Id", "2"),
new XElement("Name", "李四"),
new XElement("Age", "28")
)
)
);
// 默认Save输出
doc.Save("default_output.xml");
}
}
生成的default_output.xml内容如下,所有内容都在一行:
<Root><User Id="1"><Name>张三</Name><Age>25</Age></User><User Id="2"><Name>李四</Name><Age>28</Age></User></Root>
使用XmlWriterSettings实现格式化输出
要实现格式化输出,核心是使用XmlWriterSettings类配置输出参数,再通过接受XmlWriter的Save重载方法输出内容。关键配置项有两个:
- Indent:设置为true时,开启缩进功能
- IndentChars:指定缩进使用的字符,默认是空格,也可以设置为制表符
完整的格式化输出代码示例如下:
using System;
using System.Xml;
using System.Xml.Linq;
class Program
{
static void Main()
{
XDocument doc = new XDocument(
new XElement("Root",
new XElement("User",
new XAttribute("Id", "1"),
new XElement("Name", "张三"),
new XElement("Age", "25")
),
new XElement("User",
new XAttribute("Id", "2"),
new XElement("Name", "李四"),
new XElement("Age", "28")
)
)
);
// 创建XmlWriter配置
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true; // 开启缩进
settings.IndentChars = " "; // 使用两个空格缩进
settings.NewLineOnAttributes = false; // 属性不换行,默认即可
// 使用XmlWriter写入文件
using (XmlWriter writer = XmlWriter.Create("formatted_output.xml", settings))
{
doc.Save(writer);
}
}
}
生成的formatted_output.xml内容如下,结构清晰易读:
<Root>
<User Id="1">
<Name>张三</Name>
<Age>25</Age>
</User>
<User Id="2">
<Name>李四</Name>
<Age>28</Age>
</User>
</Root>
其他格式化场景说明
输出到字符串而非文件
如果需要将格式化后的XML内容输出到字符串中,同样可以使用XmlWriter配合StringWriter实现:
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Linq;
class Program
{
static void Main()
{
XDocument doc = new XDocument(
new XElement("Root",
new XElement("Test", "内容")
)
);
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = " ";
// 不输出XML声明
settings.OmitXmlDeclaration = true;
StringBuilder sb = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(sb, settings))
{
doc.Save(writer);
}
string formattedXml = sb.ToString();
Console.WriteLine(formattedXml);
}
}
自定义缩进字符
如果需要使用制表符作为缩进,只需要修改IndentChars的值即可:
settings.IndentChars = "t"; // 使用制表符缩进
注意事项
需要注意,XmlWriterSettings的配置只对通过XmlWriter输出的场景生效,如果直接调用doc.Save("文件路径")这种无参数的重载,是无法应用格式化配置的。另外,如果XML文档中包含混合内容(即元素中同时包含文本和子元素),缩进可能会导致文本内容出现多余的空白,这种场景下需要根据实际需求调整配置。
C#_XDocumentSave方法XML格式化缩进输出XmlWriter修改时间:2026-07-11 02:51:24