在C#的.NET开发中,生成XML文件是常见的需求,XmlTextWriter作为System.Xml命名空间下的专用类,提供了高效的流式XML写入能力,适合处理大体积XML文件的生成场景。

XmlTextWriter基础介绍
XmlTextWriter是继承自XmlWriter的抽象类的实现类,它的设计目标是提供一种快速、只进的方式来生成XML文档,不需要把整个XML文档加载到内存中,内存占用更低。和手动拼接字符串生成XML相比,XmlTextWriter会自动处理XML的特殊字符转义,保证生成的XML符合规范,避免出现格式错误。
使用XmlTextWriter前需要先引入System.Xml命名空间,它最常见的构造方式是传入文件路径和编码格式,也可以绑定到流对象上使用。需要注意的是,XmlTextWriter在.NET Framework后续版本中被建议优先使用XmlWriter的Create方法创建实例,但XmlTextWriter本身的用法依然稳定可用,适合旧项目维护和新手学习XML生成逻辑。
核心方法与属性说明
掌握XmlTextWriter的核心方法是生成XML的关键,下面是常用的属性和方法说明:
- Formatting属性:设置XML的输出格式,可选值为Formatting.None(无缩进,紧凑格式)和Formatting.Indented(带缩进,可读性更高)。
- Indentation属性:当Formatting设为Indented时,设置缩进的字符数,默认是2。
- IndentChar属性:设置缩进使用的字符,默认是空格。
- WriteStartDocument方法:写入XML声明,比如<?xml version="1.0" encoding="utf-8"?>,可选是否包含独立属性。
- WriteStartElement方法:写入一个开始标签,比如WriteStartElement("book")会生成<book>。
- WriteEndElement方法:写入当前元素的结束标签,会自动匹配最近未关闭的开始标签,不需要手动传入元素名。
- WriteElementString方法:一步写入一个包含文本内容的完整元素,比如WriteElementString("name", "C#编程")会生成<name>C#编程</name>。
- WriteAttributeString方法:给当前元素写入属性,需要在开始标签之后、结束标签之前调用。
- WriteString方法:写入元素的文本内容,会自动转义特殊字符,比如写入<div>会变成<div>。
- WriteComment方法:写入XML注释,比如WriteComment("这是图书信息列表")会生成<!--这是图书信息列表-->。
- Close方法:关闭写入器,释放关联的资源,写入完成后必须调用,否则内容可能不会完整保存到文件。
完整生成XML示例
下面通过一个生成图书信息XML文件的完整示例,演示XmlTextWriter的整个使用流程,生成的XML包含图书列表,每本图书有id属性,以及名称、作者、价格子节点。
using System;
using System.Xml;
namespace XmlTextWriterDemo
{
class Program
{
static void Main(string[] args)
{
// 定义要生成的XML文件路径
string xmlFilePath = "books.xml";
// 创建XmlTextWriter实例,指定文件路径和编码为UTF-8
XmlTextWriter writer = new XmlTextWriter(xmlFilePath, System.Text.Encoding.UTF8);
try
{
// 设置输出格式为带缩进,方便阅读
writer.Formatting = Formatting.Indented;
writer.Indentation = 4; // 设置缩进为4个空格
writer.IndentChar = ' '; // 缩进字符为空格
// 写入XML声明,版本1.0,独立属性为yes
writer.WriteStartDocument(true);
// 写入根元素books
writer.WriteStartElement("books");
// 写入注释
writer.WriteComment("图书信息列表,包含多本图书的详细信息");
// 第一本图书
writer.WriteStartElement("book");
writer.WriteAttributeString("id", "1"); // 添加id属性
writer.WriteElementString("name", "C#从入门到精通"); // 图书名称
writer.WriteElementString("author", "张三"); // 作者
writer.WriteElementString("price", "89.90"); // 价格
writer.WriteEndElement(); // 结束book元素
// 第二本图书
writer.WriteStartElement("book");
writer.WriteAttributeString("id", "2");
writer.WriteElementString("name", ".NET Core实战");
writer.WriteElementString("author", "李四");
writer.WriteElementString("price", "79.00");
writer.WriteEndElement();
// 第三本图书,包含特殊字符的内容
writer.WriteStartElement("book");
writer.WriteAttributeString("id", "3");
writer.WriteElementString("name", "XML&Json数据处理"); // 内容包含&符号,会自动转义
writer.WriteElementString("author", "王五");
writer.WriteElementString("price", "69.50");
writer.WriteEndElement();
// 结束根元素books
writer.WriteEndElement();
// 结束XML文档
writer.WriteEndDocument();
Console.WriteLine("XML文件生成成功,路径:" + xmlFilePath);
}
catch (Exception ex)
{
Console.WriteLine("生成XML文件失败:" + ex.Message);
}
finally
{
// 确保写入器被关闭,释放资源
if (writer != null)
{
writer.Close();
}
}
}
}
}运行上述代码后,会在程序运行目录下生成books.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<books>
<!--图书信息列表,包含多本图书的详细信息-->
<book id="1">
<name>C#从入门到精通</name>
<author>张三</author>
<price>89.90</price>
</book>
<book id="2">
<name>.NET Core实战</name>
<author>李四</author>
<price>79.00</price>
</book>
<book id="3">
<name>XML&Json数据处理</name>
<author>王五</author>
<price>69.50</price>
</book>
</books>使用注意事项
资源释放问题
XmlTextWriter实现了IDisposable接口,除了手动调用Close方法外,也可以使用using语句包裹,自动释放资源,避免文件被占用的情况。修改上面的代码可以写成:
using (XmlTextWriter writer = new XmlTextWriter(xmlFilePath, System.Text.Encoding.UTF8))
{
// 写入XML的逻辑
// 不需要手动调用Close,using结束会自动释放
}编码设置问题
构造XmlTextWriter时传入的编码参数会决定XML声明中的encoding属性,如果传入Encoding.UTF8,生成的XML声明就是encoding="utf-8"。如果要生成其他编码的XML,比如GB2312,可以传入对应的编码对象,但需要注意系统是否支持该编码。
元素嵌套规则
使用WriteStartElement打开的元素,必须通过WriteEndElement关闭,且关闭顺序要和打开顺序一致,否则会抛出XML格式错误的异常。如果不确定嵌套层级,优先使用WriteElementString方法写入完整元素,减少手动开关标签的错误。
特殊字符处理
XmlTextWriter的WriteString和WriteElementString方法会自动处理XML中的特殊字符,比如<、>、&、"、\',不需要手动转义,这也是它比字符串拼接生成XML更安全的原因。如果手动拼接字符串写入内容,很容易出现特殊字符未转义导致的XML格式错误。
XmlTextWriter与XmlWriter对比
在.NET Framework 2.0及之后,微软推荐使用XmlWriter.Create静态方法创建XmlWriter实例,XmlWriter是抽象类,Create方法会根据设置返回对应的实现类,功能更完善。和XmlTextWriter相比,XmlWriter的Create方法支持更多的设置选项,比如是否忽略注释、是否检查XML格式合法性等。
不过XmlTextWriter的用法更直观,适合新手理解XML生成的流程,两者的核心写入逻辑是相通的。如果是新开发的项目,建议优先使用XmlWriter.Create的方式,兼容性更好,旧项目维护可以继续使用XmlTextWriter,不需要强制修改。
常见错误排查
如果生成的XML文件无法打开,或者内容不完整,可以排查以下几个点:
- 是否调用了Close方法或者正确释放了资源,没有释放的话缓冲区的内容可能不会写入文件。
- 元素的开始和结束是否匹配,有没有漏写WriteEndElement的情况。
- 编码设置是否和XML声明中的encoding一致,不一致可能出现乱码。
- 是否在写入过程中抛出了异常,导致后续写入逻辑没有执行,可以在代码中加入异常处理捕获错误原因。
XmlTextWriterXML生成C#编程.NETXML文件操作修改时间:2026-05-24 22:23:46