在.NET Core应用开发中,xml格式的数据交互和配置文件解析场景十分常见,System.Xml.XmlReader是.NET内置的轻量级xml读取类,采用流式读取方式,不需要将整个xml文档加载到内存中,非常适合处理体积较大的xml文件,能够有效降低内存占用,提升处理效率。

System.Xml.XmlReader核心特性
XmlReader属于抽象类,实际使用时需要通过静态方法创建具体实例,它的核心特性包括:
- 只读、前向的游标式读取,只能从文档开头向结尾依次读取节点,不支持回退操作
- 流式处理模式,内存占用低,适合处理GB级别的超大xml文件
- 支持验证xml文档是否符合指定架构,也支持忽略验证仅做基础解析
- 提供丰富的节点类型判断方法,可精准识别元素、属性、文本、注释等不同节点
创建XmlReader实例
在.NET Core中创建XmlReader实例需要先配置XmlReaderSettings参数,再通过XmlReader.Create方法生成实例,基础创建代码如下:
using System.Xml;
// 配置读取设置
XmlReaderSettings settings = new XmlReaderSettings();
// 忽略注释节点,不需要处理的话可以开启
settings.IgnoreComments = true;
// 开启DTD处理,默认是Prohibit禁止,按需开启
// settings.DtdProcessing = DtdProcessing.Parse;
// 从文件路径创建XmlReader
using (XmlReader reader = XmlReader.Create("test.xml", settings))
{
// 读取逻辑写在这里
}
// 也可以从字符串流创建
string xmlContent = "<root><item>测试内容</item></root>";
using (StringReader stringReader = new StringReader(xmlContent))
using (XmlReader reader = XmlReader.Create(stringReader, settings))
{
// 读取逻辑写在这里
}
基础读取操作示例
XmlReader通过Read方法逐个节点向前移动,每次调用会读取下一个节点,返回bool值表示是否还有可读取的节点,以下是读取元素节点和文本内容的示例:
using System;
using System.Xml;
class Program
{
static void Main()
{
string xml = @"<?xml version='1.0' encoding='utf-8'?>
<students>
<student id='1'>
<name>张三</name>
<age>20</age>
</student>
<student id='2'>
<name>李四</name>
<age>22</age>
</student>
</students>";
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
using (StringReader stringReader = new StringReader(xml))
using (XmlReader reader = XmlReader.Create(stringReader, settings))
{
while (reader.Read())
{
// 判断当前节点是否为元素开始标签
if (reader.NodeType == XmlNodeType.Element)
{
Console.WriteLine($"遇到元素: {reader.Name}");
// 如果有属性,读取属性内容
if (reader.HasAttributes)
{
while (reader.MoveToNextAttribute())
{
Console.WriteLine($" 属性名: {reader.Name}, 属性值: {reader.Value}");
}
// 移动回元素节点
reader.MoveToElement();
}
}
// 判断当前节点是否为文本节点
else if (reader.NodeType == XmlNodeType.Text)
{
Console.WriteLine($"文本内容: {reader.Value}");
}
}
}
}
}
常用方法说明
XmlReader提供了多个实用方法辅助解析,常用方法整理如下:
| 方法名 | 作用说明 |
|---|---|
| Read() | 读取下一个节点,返回true表示还有节点,false表示已到文档末尾 |
| ReadStartElement() | 检查当前节点是否为元素开始标签,是则读取该节点并移动到下一个节点,否则抛出异常 |
| ReadElementContentAsString() | 读取当前元素的内容并返回字符串,自动处理内部的文本节点 |
| MoveToNextAttribute() | 移动到当前元素的下一个属性,需要配合HasAttributes使用 |
| Skip() | 跳过当前节点的所有子节点,直接移动到当前节点的闭合标签之后 |
注意事项
XmlReader是单向只读的,无法修改xml文档内容,如果需要修改xml建议使用XmlDocument或者XDocument类。
使用XmlReader时需要注意节点类型的判断,不同节点类型对应的处理逻辑不同,避免直接读取错误类型的节点导致异常。另外XmlReader实例实现了IDisposable接口,建议使用using语句包裹,确保资源及时释放。
在处理外部来源的xml文件时,建议开启安全配置,避免XXE漏洞,默认情况下XmlReaderSettings的DtdProcessing是Prohibit,不要随意修改为Parse,除非明确需要解析DTD内容且确认来源安全。
System.Xml.XmlReader.NET_Corexml文件处理修改时间:2026-07-22 19:42:25