如何用Linq读取XML文件?附详细示例代码

来源:程序开发作者:小黄人头衔:程序员
导读:本期聚焦于小伙伴创作的《如何用Linq读取XML文件?附详细示例代码》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用Linq读取XML文件?附详细示例代码》有用,将其分享出去将是对创作者最好的鼓励。

在CSharp开发场景中,XML常作为配置文件或数据交换格式使用,Linq to XML提供了简洁高效的API来操作这类文件,相比传统的XmlDocument方式,代码可读性更强,编写效率更高。

如何用Linq读取XML文件?附详细示例代码

Linq读取XML的基础准备

首先需要引入必要的命名空间,Linq to XML的核心类都位于System.Xml.Linq命名空间中,使用前需要在代码文件顶部添加引用。

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

假设我们有一个存储学生信息的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>

加载XML文件

使用Linq读取XML的第一步是加载XML文件,XDocument类提供了Load方法可以直接从文件路径加载XML内容,也可以通过Parse方法加载XML字符串。

// 从文件路径加载XML
XDocument doc = XDocument.Load("Students.xml");
// 如果是XML字符串,可以使用Parse方法
// string xmlStr = "<Students><Student>test</Student></Students>";
// XDocument doc = XDocument.Parse(xmlStr);

基础查询:读取所有学生信息

加载完成后,可以通过Descendants方法获取指定名称的所有子元素,结合Linq的查询语法或方法语法提取需要的数据。

// 方法语法查询所有学生信息
var allStudents = doc.Descendants("Student")
    .Select(s => new
    {
        Id = s.Attribute("Id")?.Value,
        Name = s.Element("Name")?.Value,
        Age = s.Element("Age")?.Value,
        Class = s.Element("Class")?.Value
    })
    .ToList();

// 输出所有学生信息
foreach (var stu in allStudents)
{
    Console.WriteLine($"学号:{stu.Id},姓名:{stu.Name},年龄:{stu.Age},班级:{stu.Class}");
}

条件查询:筛选符合要求的节点

可以在Linq查询中添加where条件,实现特定节点的筛选,比如查询年龄是20岁的学生信息。

// 查询年龄为20岁的学生
var age20Students = doc.Descendants("Student")
    .Where(s => s.Element("Age")?.Value == "20")
    .Select(s => new
    {
        Id = s.Attribute("Id")?.Value,
        Name = s.Element("Name")?.Value,
        Class = s.Element("Class")?.Value
    })
    .ToList();

Console.WriteLine("年龄为20岁的学生:");
foreach (var stu in age20Students)
{
    Console.WriteLine($"学号:{stu.Id},姓名:{stu.Name},班级:{stu.Class}");
}

复杂查询:多条件与属性读取

如果需要同时匹配多个条件,比如查询计算机1班且年龄为20岁的学生,可以组合多个where条件,同时支持读取元素的属性值和子元素值。

// 查询计算机1班且年龄为20岁的学生
var targetStudents = from s in doc.Descendants("Student")
                    where s.Element("Age")?.Value == "20" 
                    && s.Element("Class")?.Value == "计算机1班"
                    select new
                    {
                        Id = s.Attribute("Id")?.Value,
                        Name = s.Element("Name")?.Value
                    };

Console.WriteLine("计算机1班且年龄为20岁的学生:");
foreach (var stu in targetStudents)
{
    Console.WriteLine($"学号:{stu.Id},姓名:{stu.Name}");
}

注意事项

  • 使用Element方法获取子元素时,如果元素不存在会返回null,因此需要添加null判断避免空引用异常,示例中使用了?.运算符简化判断。
  • Attribute方法用于获取元素的属性,同样需要做null判断,防止属性不存在时出错。
  • 如果XML文件有命名空间,需要使用XNamespace配合元素名查询,否则无法匹配到对应节点。
  • 读取到的元素值默认是字符串类型,如果需要转换为其他类型,比如年龄转为int,可以使用int.ParseConvert.ToInt32方法,注意处理转换异常。
使用Linq读取XML时,尽量优先使用方法语法,代码会更简洁,同时合理利用匿名类型可以快速封装需要的数据,减少冗余代码。

LinqXML读取XMLCSharp修改时间:2026-07-24 02:42:30

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