Xml作为一种轻量级的数据存储格式,常被用来存储结构化数据,而Linq to Xml提供了简洁的API来操作Xml文档,能够方便地遍历其中存储的数据。下面先介绍基础的Xml数据存储结构,再演示遍历的具体实现。

Xml数据存储的基本结构
首先我们需要有一个存储了数据的Xml文件,假设我们有一个存储学生信息的Xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<Students>
<Student>
<Id>1</Id>
<Name>张三</Name>
<Age>20</Age>
<Class>计算机1班</Class>
</Student>
<Student>
<Id>2</Id>
<Name>李四</Name>
<Age>21</Age>
<Class>计算机2班</Class>
</Student>
<Student>
<Id>3</Id>
<Name>王五</Name>
<Age>20</Age>
<Class>计算机1班</Class>
</Student>
</Students>
使用Linq遍历Xml数据的基础步骤
要遍历Xml中存储的数据,首先需要加载Xml文档,然后通过XDocument或XElement类获取对应的节点,再结合Linq的查询语法或方法语法提取数据。下面是具体的实现步骤和代码示例。
1. 加载Xml文档
可以使用XDocument.Load方法加载本地Xml文件,也可以使用XDocument.Parse方法加载Xml字符串。以下是加载本地文件的示例:
using System;
using System.Linq;
using System.Xml.Linq;
class Program
{
static void Main()
{
// 加载Xml文件,路径替换为实际文件路径
XDocument doc = XDocument.Load("Students.xml");
}
}
2. 获取根节点下的所有子节点
加载完成后,我们可以通过Root属性获取Xml的根节点,再通过Elements方法获取根节点下所有指定名称的子节点,这里我们要获取所有Student节点。
// 获取所有Student节点
var students = doc.Root.Elements("Student");
3. 遍历节点提取数据
获取到所有Student节点后,就可以通过Linq遍历每个节点,提取内部的Id、Name、Age、Class等子节点的内容。可以使用方法语法或者查询语法实现,以下是两种方式的示例:
方法语法遍历
// 方法语法遍历,提取每个学生的信息
foreach (var student in students)
{
int id = (int)student.Element("Id");
string name = (string)student.Element("Name");
int age = (int)student.Element("Age");
string className = (string)student.Element("Class");
Console.WriteLine($"Id:{id}, 姓名:{name}, 年龄:{age}, 班级:{className}");
}
查询语法遍历
// 查询语法遍历,筛选年龄大于等于21的学生
var filterStudents = from s in doc.Root.Elements("Student")
where (int)s.Element("Age") >= 21
select new
{
Id = (int)s.Element("Id"),
Name = (string)s.Element("Name"),
Age = (int)s.Element("Age"),
Class = (string)s.Element("Class")
};
foreach (var item in filterStudents)
{
Console.WriteLine($"Id:{item.Id}, 姓名:{item.Name}, 年龄:{item.Age}, 班级:{item.Class}");
}
处理复杂结构的Xml数据
如果Xml的存储结构更复杂,比如嵌套了多层节点,或者存在属性而非子节点的情况,同样可以用Linq处理。例如下面的Xml中,学生的班级信息作为Student节点的属性存储:
<?xml version="1.0" encoding="utf-8"?>
<Students>
<Student Class="计算机1班">
<Id>1</Id>
<Name>张三</Name>
<Age>20</Age>
</Student>
<Student Class="计算机2班">
<Id>2</Id>
<Name>李四</Name>
<Age>21</Age>
</Student>
</Students>
此时遍历提取班级属性值的代码如下:
var studentsWithAttr = doc.Root.Elements("Student");
foreach (var student in studentsWithAttr)
{
int id = (int)student.Element("Id");
string name = (string)student.Element("Name");
int age = (int)student.Element("Age");
// 获取Class属性的值
string className = (string)student.Attribute("Class");
Console.WriteLine($"Id:{id}, 姓名:{name}, 年龄:{age}, 班级:{className}");
}
注意事项
- 遍历前需要确认Xml节点的名称是否正确,区分大小写,否则会获取不到对应的节点。
- 如果节点可能不存在,需要先判断
Element或Attribute的返回值是否为空,避免强制转换时出现空引用异常。 - 如果Xml文件较大,遍历时可以考虑使用延迟执行特性,避免一次性加载过多数据到内存。