在C#中处理XML数据时,XmlReader和XmlWriter是System.Xml命名空间下用于高性能流式读写的核心类。它们不将整个文档加载到内存,而是按顺序访问节点或写出节点,非常适合大文件场景。

XmlReader读取XML
XmlReader提供只进、只读的访问方式。通过XmlReader.Create方法创建实例后,使用Read方法移动游标,配合NodeType和Name等属性判断当前节点。
using System;
using System.Xml;
class Program
{
static void Main()
{
// 从文件创建XmlReader
using (XmlReader reader = XmlReader.Create("data.xml"))
{
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "book")
{
// 读取属性
string id = reader.GetAttribute("id");
Console.WriteLine("Book id: " + id);
}
if (reader.NodeType == XmlNodeType.Text)
{
Console.WriteLine("Value: " + reader.Value);
}
}
}
}
}
常用读取方法
- Read:前进到下一个节点
- ReadStartElement:读取开始标签并前进
- ReadElementContentAsString:读取元素文本内容
- GetAttribute:获取属性值
XmlWriter写入XML
XmlWriter以流式方式生成XML,可控制格式缩进。使用WriteStartElement、WriteAttributeString和WriteElementString等方法构建文档。
using System;
using System.Xml;
class Program
{
static void Main()
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true; // 启用缩进
using (XmlWriter writer = XmlWriter.Create("out.xml", settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("library");
writer.WriteStartElement("book");
writer.WriteAttributeString("id", "1");
writer.WriteElementString("title", "C#入门");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
}
Console.WriteLine("XML已写出");
}
}
写入注意事项
必须保证开始元素与结束元素配对,可调用WriteEndElement或WriteFullEndElement。设置Indent能提升人工可读性,但会略微增加输出体积。
性能对比与建议
| 方式 | 内存占用 | 适用场景 |
|---|---|---|
| XmlDocument | 高 | 小文件随机访问 |
| XmlReader/XmlWriter | 低 | 大文件流式处理 |
当XML体积超过几十MB或仅需提取部分字段时,优先使用XmlReader和XmlWriter。若需在代码术语中标注类型,可用XmlReader与XmlWriter表示类名称。注意在正文描述HTML标签时应写作<input>而非真实标签。
流式读写的核心思想是:不保存全树,用时间换空间。
小结
掌握XmlReader的Read循环与XmlWriter的元素配对写法,就能在C#中轻松实现高性能XML处理。实际项目中建议封装通用辅助方法,减少重复代码。