C# XmlWriter详细用法:节点、属性、CDATA及UTF-8格式设置
在C#开发中,使用 XmlWriter 生成结构化数据是常见需求。本文深入解析如何利用该API处理XML声明、节点、属性、CDATA及注释,并详细演示如何通过 XmlWriterSettings 强制输出UTF-8编码及格式化缩进,避免默认的UTF-16乱码问题。
准备条件与核心类
要使用 XmlWriter,需引入 System.Xml 命名空间。核心工作流包括实例化设置对象、创建写入器、执行写入操作以及最后关闭文档以确保标签正确闭合。
第1步:配置XmlWriterSettings解决UTF-16问题
目的: 防止默认输出UTF-16编码,并启用缩进以提高可读性。
关键参数:
Indent = true:开启自动缩进换行。Encoding:必须设置为new UTF8Encoding(false)。注意: 不要直接使用Encoding.UTF8,否则会在文件开头生成不可见的BOM字节(非XML内容)。
复制代码 代码如下:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
// 使用 false 参数构造 UTF8Encoding 以去除 BOM
settings.Encoding = new UTF8Encoding(false);
// 设置换行符为当前系统环境
settings.NewLineChars = Environment.NewLine;第2步:创建XmlWriter实例
入口: XmlWriter.Create(Stream stream, XmlWriterSettings settings)
动作: 将设置好的 settings 应用于目标流(如 MemoryStream)。
using (XmlWriter xmlWriter = XmlWriter.Create(ms, settings))
{
// 在此作用域内执行写入操作
}
XML元素与属性写入操作
第3步:写XML文档声明与根节点
目的: 添加标准的 头,并定义根元素。
动作: 调用 WriteStartDocument 和 WriteStartElement。
复制代码 代码如下:
// 参数指定是否为独立文档 (standalone)
xmlWriter.WriteStartDocument(false);
// 开始根节点 "root"
xmlWriter.WriteStartElement("root");第4步:写入子节点、属性及文本内容
目的: 构建包含属性和文本值的嵌套节点结构。
操作顺序:
WriteStartElement("nodeName"):开始新节点。WriteAttributeString("attrName", "value"):为该节点添加属性。WriteString("textContent"):直接写入文本内容。WriteEndElement():闭合当前节点。
复制代码 代码如下:
xmlWriter.WriteStartElement("cat");
xmlWriter.WriteAttributeString("color", "white");
xmlWriter.WriteString("I'm a cat");
xmlWriter.WriteEndElement();第5步:快速写入简单节点(WriteElementString)
适用场景: 仅需包含纯文本内容的简单节点,无需单独设置属性。
xmlWriter.WriteElementString("pig", "pig is great");
// 等价于手动执行 StartElement -> WriteString -> EndElement
高级内容处理:CDATA与注释
第6步:写入CData块
目的: 当内容包含特殊字符(如 <, &)且不想转义时使用。
复制代码 代码如下:
xmlWriter.WriteStartElement("dog");
xmlWriter.WriteCData("<strong>dog is dog</strong>");
xmlWriter.WriteEndElement();第7步:添加注释
入口: WriteComment(string text)
xmlWriter.WriteComment("this is an example comment");
// 输出形式: <!-- this is an example comment -->
完整代码示例与验证
以下示例整合了上述所有步骤,使用 MemoryStream 捕获输出并转换为字符串打印。
复制代码 代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;
namespace UseXmlWriter
{
class Program
{
static void Main(string[] args)
{
using (MemoryStream ms = new MemoryStream())
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.Encoding = new UTF8Encoding(false);
settings.NewLineChars = Environment.NewLine;
using (XmlWriter xmlWriter = XmlWriter.Create(ms, settings))
{
// 1. 文档声明
xmlWriter.WriteStartDocument(false);
// 2. 根节点
xmlWriter.WriteStartElement("root");
// 3. 带属性的子节点
xmlWriter.WriteStartElement("cat");
xmlWriter.WriteAttributeString("color", "white");
xmlWriter.WriteString("I'm a cat");
xmlWriter.WriteEndElement();
// 4. 简单元素
xmlWriter.WriteElementString("pig", "pig is great");
// 5. CDATA 节点
xmlWriter.WriteStartElement("dog");
xmlWriter.WriteCData("<strong>dog is dog</strong>");
xmlWriter.WriteEndElement();
// 6. 注释
xmlWriter.WriteComment("Example by Author");
// 7. 闭合所有层级
xmlWriter.WriteEndElement();
xmlWriter.WriteEndDocument();
}
// 8. 结果验证:输出 UTF-8 字符串
string xml = Encoding.UTF8.GetString(ms.ToArray());
Console.WriteLine(xml);
Console.Read();
}
}
}
}完成判断: 运行后控制台应输出格式良好、无BOM头、且包含指定结构与数据的UTF-8编码XML字符串。
以上就是基于C#中XmlWriter写入Xml的详细内容,更多关于C# XML操作与编码处理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













