C#如何使用Linq to XML解析XML文件

来源:开发教程作者:阿里山老登头衔:草根站长
导读:本期聚焦于小伙伴创作的《C#如何使用Linq to XML解析XML文件》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何使用Linq to XML解析XML文件》有用,将其分享出去将是对创作者最好的鼓励。

在C#开发场景中,XML文件常被用来存储配置信息、传输结构化数据,Linq to XML是.NET Framework 3.5及以后版本提供的XML处理方案,它基于LINQ查询语法,操作比传统XmlDocument更直观,代码量也更少。下面我们通过具体示例逐步讲解其使用方法。

C#如何使用Linq to XML解析XML文件

Linq to XML核心类介绍

使用Linq to XML前需要先引入System.Xml.Linq命名空间,其中最常用的几个类如下:

  • XDocument:表示整个XML文档,可用于加载、保存XML文件,也可以直接构造新的XML文档
  • XElement:表示XML中的一个元素节点,是操作XML的核心类,可获取元素名称、值、属性、子元素等
  • XAttribute:表示XML元素的一个属性
  • XNode:表示XML节点的基类,XElement、XText等都继承自该类

加载和读取XML文件

首先我们准备一个测试用的XML文件,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<students>
  <student id="1">
    <name>张三</name>
    <age>20</age>
    <class>计算机1班</class>
  </student>
  <student id="2">
    <name>李四</name>
    <age>21</age>
    <class>计算机2班</class>
  </student>
  <student id="3">
    <name>王五</name>
    <age>20</age>
    <class>计算机1班</class>
  </student>
</students>

我们可以通过XDocument.Load方法加载本地XML文件,也可以通过XDocument.Parse方法加载XML字符串,以下是加载文件并读取所有学生信息的代码示例:

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

namespace LinqToXmlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 加载本地XML文件,路径替换为实际文件路径
            XDocument doc = XDocument.Load(@"D:test.xml");
            // 获取根元素下的所有student子元素
            var students = doc.Root.Elements("student");
            // 遍历输出每个学生的信息
            foreach (var student in students)
            {
                // 获取id属性值
                string id = student.Attribute("id").Value;
                // 获取name子元素的值
                string name = student.Element("name").Value;
                // 获取age子元素的值
                string age = student.Element("age").Value;
                // 获取class子元素的值
                string className = student.Element("class").Value;
                Console.WriteLine($"学号:{id},姓名:{name},年龄:{age},班级:{className}");
            }
        }
    }
}

使用LINQ查询筛选XML数据

Linq to XML的优势在于可以结合LINQ查询语法快速筛选数据,比如我们需要查询所有20岁的学生,或者查询计算机1班的学生,代码实现如下:

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

namespace LinqToXmlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(@"D:test.xml");
            // 查询所有年龄为20的学生
            var age20Students = from s in doc.Root.Elements("student")
                                where s.Element("age").Value == "20"
                                select s;
            Console.WriteLine("年龄为20的学生:");
            foreach (var student in age20Students)
            {
                Console.WriteLine($"姓名:{student.Element("name").Value},班级:{student.Element("class").Value}");
            }

            // 查询计算机1班的学生
            var class1Students = doc.Root.Elements("student")
                .Where(s => s.Element("class").Value == "计算机1班");
            Console.WriteLine("n计算机1班的学生:");
            foreach (var student in class1Students)
            {
                Console.WriteLine($"姓名:{student.Element("name").Value},年龄:{student.Element("age").Value}");
            }
        }
    }
}

修改XML节点和属性

使用Linq to XML修改XML内容也非常简单,我们可以直接修改元素的值、属性的值,也可以添加新的子元素或者删除节点,以下是修改示例:

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

namespace LinqToXmlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(@"D:test.xml");
            // 找到id为1的学生节点
            var targetStudent = doc.Root.Elements("student")
                .FirstOrDefault(s => s.Attribute("id").Value == "1");
            if (targetStudent != null)
            {
                // 修改年龄元素的值
                targetStudent.Element("age").Value = "22";
                // 修改id属性的值
                targetStudent.Attribute("id").Value = "1001";
                // 添加新的子元素score
                targetStudent.Add(new XElement("score", "95"));
                // 保存修改后的XML到新文件
                doc.Save(@"D:test_modified.xml");
                Console.WriteLine("XML修改完成,已保存到新文件");
            }
        }
    }
}

创建新的XML文件

除了解析已有的XML文件,我们也可以用Linq to XML直接构造新的XML文档并保存,代码示例如下:

using System;
using System.Xml.Linq;

namespace LinqToXmlDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 构造新的XML文档
            XDocument newDoc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("books",
                    new XElement("book",
                        new XAttribute("id", "1"),
                        new XElement("title", "C#编程入门"),
                        new XElement("author", "张三"),
                        new XElement("price", "59.9")
                    ),
                    new XElement("book",
                        new XAttribute("id", "2"),
                        new XElement("title", "LINQ实战"),
                        new XElement("author", "李四"),
                        new XElement("price", "69.9")
                    )
                )
            );
            // 保存XML文件
            newDoc.Save(@"D:new_books.xml");
            Console.WriteLine("新XML文件创建完成");
        }
    }
}

注意事项

在使用Linq to XML时需要注意几个问题:首先获取元素或属性前最好先判断是否存在,避免出现空引用异常,比如可以用Element("name")?.Value的写法;其次XML中的元素值都是字符串类型,如果需要数值类型需要手动转换;最后如果XML文件较大,频繁加载整个文档可能占用较多内存,此时可以考虑流式读取的方式,但Linq to XML本身更适合中小体积XML文件的处理场景。

C#Linq_to_XMLXML解析XML文件修改时间:2026-07-03 00:30:35

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