如何用C#实现XML文件的读写操作

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《如何用C#实现XML文件的读写操作》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用C#实现XML文件的读写操作》有用,将其分享出去将是对创作者最好的鼓励。

在C#开发中,处理XML文件是常见的需求,不同的场景适合不同的读写方案,下面将介绍三种主流的实现方式,搭配完整代码示例说明具体用法。

如何用C#实现XML文件的读写操作

一、使用XmlDocument类读写XML

XmlDocument是基于文档对象模型(DOM)的XML处理类,适合需要灵活操作XML节点结构的场景。

1.1 写入XML文件

下面的代码演示了如何创建一个包含学生信息的XML文件:

using System.Xml;

class XmlDocumentWriteExample
{
    static void Main()
    {
        // 创建XmlDocument实例
        XmlDocument xmlDoc = new XmlDocument();
        // 创建XML声明节点
        XmlDeclaration xmlDecl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
        xmlDoc.AppendChild(xmlDecl);
        // 创建根节点
        XmlElement root = xmlDoc.CreateElement("Students");
        xmlDoc.AppendChild(root);
        // 创建第一个学生节点
        XmlElement student1 = xmlDoc.CreateElement("Student");
        // 设置学生节点的id属性
        student1.SetAttribute("id", "1");
        // 创建姓名字子节点
        XmlElement name1 = xmlDoc.CreateElement("Name");
        name1.InnerText = "张三";
        student1.AppendChild(name1);
        // 创建年龄子节点
        XmlElement age1 = xmlDoc.CreateElement("Age");
        age1.InnerText = "20";
        student1.AppendChild(age1);
        root.AppendChild(student1);
        // 创建第二个学生节点
        XmlElement student2 = xmlDoc.CreateElement("Student");
        student2.SetAttribute("id", "2");
        XmlElement name2 = xmlDoc.CreateElement("Name");
        name2.InnerText = "李四";
        student2.AppendChild(name2);
        XmlElement age2 = xmlDoc.CreateElement("Age");
        age2.InnerText = "22";
        student2.AppendChild(age2);
        root.AppendChild(student2);
        // 保存XML到文件
        xmlDoc.Save("students.xml");
        System.Console.WriteLine("XML文件写入成功");
    }
}

1.2 读取XML文件

读取上述生成的XML文件,遍历所有学生信息:

using System.Xml;

class XmlDocumentReadExample
{
    static void Main()
    {
        XmlDocument xmlDoc = new XmlDocument();
        // 加载XML文件
        xmlDoc.Load("students.xml");
        // 获取根节点
        XmlNode root = xmlDoc.DocumentElement;
        // 遍历所有Student节点
        XmlNodeList studentNodes = root.SelectNodes("Student");
        foreach (XmlNode studentNode in studentNodes)
        {
            // 获取id属性
            string id = studentNode.Attributes["id"].Value;
            // 获取姓名节点内容
            string name = studentNode.SelectSingleNode("Name").InnerText;
            // 获取年龄节点内容
            string age = studentNode.SelectSingleNode("Age").InnerText;
            System.Console.WriteLine($"学生ID:{id},姓名:{name},年龄:{age}");
        }
    }
}

二、使用XmlSerializer序列化读写XML

XmlSerializer适合将对象直接序列化为XML,或者将XML反序列化为对象,开发效率更高,适合强类型场景。

2.1 定义实体类

首先定义与XML结构对应的学生实体类:

using System.Collections.Generic;
using System.Xml.Serialization;

// 根节点对应的类
[XmlRoot("Students")]
public class StudentList
{
    // 子节点集合
    [XmlElement("Student")]
    public List<Student> Students { get; set; } = new List<Student>();
}

// 学生节点对应的类
public class Student
{
    // id属性
    [XmlAttribute("id")]
    public string Id { get; set; }
    // 姓名元素
    [XmlElement("Name")]
    public string Name { get; set; }
    // 年龄元素
    [XmlElement("Age")]
    public string Age { get; set; }
}

2.2 序列化对象到XML

将学生对象集合序列化为XML文件:

using System.IO;
using System.Xml.Serialization;

class XmlSerializerWriteExample
{
    static void Main()
    {
        StudentList studentList = new StudentList();
        studentList.Students.Add(new Student { Id = "1", Name = "张三", Age = "20" });
        studentList.Students.Add(new Student { Id = "2", Name = "李四", Age = "22" });
        // 创建XmlSerializer实例,指定根类型
        XmlSerializer serializer = new XmlSerializer(typeof(StudentList));
        // 创建文件流
        using (FileStream fs = new FileStream("students_serialize.xml", FileMode.Create))
        {
            // 序列化对象到文件流
            serializer.Serialize(fs, studentList);
        }
        System.Console.WriteLine("序列化XML成功");
    }
}

2.3 反序列化XML到对象

将XML文件反序列化为学生对象集合:

using System.IO;
using System.Xml.Serialization;

class XmlSerializerReadExample
{
    static void Main()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(StudentList));
        using (FileStream fs = new FileStream("students_serialize.xml", FileMode.Open))
        {
            // 反序列化得到对象
            StudentList studentList = (StudentList)serializer.Deserialize(fs);
            foreach (Student student in studentList.Students)
            {
                System.Console.WriteLine($"学生ID:{student.Id},姓名:{student.Name},年龄:{student.Age}");
            }
        }
    }
}

三、使用LINQ to XML读写XML

LINQ to XML是.NET Framework 3.5之后引入的轻量级XML处理方案,语法简洁,支持LINQ查询,是现在更推荐的使用方式。

3.1 写入XML文件

使用LINQ to XML的XDocument类创建XML文件:

using System.Xml.Linq;

class LinqToXmlWriteExample
{
    static void Main()
    {
        // 创建XDocument实例
        XDocument xDoc = new XDocument(
            // 创建XML声明
            new XDeclaration("1.0", "utf-8", null),
            // 创建根节点
            new XElement("Students",
                // 第一个学生节点
                new XElement("Student",
                    new XAttribute("id", "1"),
                    new XElement("Name", "张三"),
                    new XElement("Age", "20")
                ),
                // 第二个学生节点
                new XElement("Student",
                    new XAttribute("id", "2"),
                    new XElement("Name", "李四"),
                    new XElement("Age", "22")
                )
            )
        );
        // 保存XML文件
        xDoc.Save("students_linq.xml");
        System.Console.WriteLine("LINQ to XML写入成功");
    }
}

3.2 读取XML文件

读取XML文件并查询符合条件的学生信息:

using System.Linq;
using System.Xml.Linq;

class LinqToXmlReadExample
{
    static void Main()
    {
        // 加载XML文件
        XDocument xDoc = XDocument.Load("students_linq.xml");
        // 使用LINQ查询所有学生节点
        var students = xDoc.Descendants("Student")
            .Select(s => new
            {
                Id = s.Attribute("id").Value,
                Name = s.Element("Name").Value,
                Age = s.Element("Age").Value
            });
        foreach (var student in students)
        {
            System.Console.WriteLine($"学生ID:{student.Id},姓名:{student.Name},年龄:{student.Age}");
        }
        // 查询年龄大于20的学生
        var adultStudents = students.Where(s => int.Parse(s.Age) > 20);
        System.Console.WriteLine("年龄大于20的学生:");
        foreach (var student in adultStudents)
        {
            System.Console.WriteLine($"姓名:{student.Name},年龄:{student.Age}");
        }
    }
}

三种方案对比

不同方案的适用场景如下:

方案优点适用场景
XmlDocument节点操作灵活,兼容老版本.NET需要频繁修改XML节点结构,或者维护老项目
XmlSerializer强类型,开发效率高,无需手动操作节点XML结构与固定实体类对应,需要快速实现序列化反序列化
LINQ to XML语法简洁,支持LINQ查询,轻量级新项目开发,需要灵活查询和处理XML数据

C#XML读写XmlDocumentXmlSerializerLINQ_to_XML修改时间:2026-06-04 15:02:02

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。