C# XmlWriter详细用法:节点、属性、CDATA及UTF-8格式设置

蓝鲸
蓝鲸
发布时间:2026-10-14 | 2人浏览过
原创

在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步:写入子节点、属性及文本内容

目的: 构建包含属性和文本值的嵌套节点结构。

操作顺序:

  1. WriteStartElement("nodeName"):开始新节点。
  2. WriteAttributeString("attrName", "value"):为该节点添加属性。
  3. WriteString("textContent"):直接写入文本内容。
  4. 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操作与编码处理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表