在VB.NET开发中,处理XML数据是很多项目都会遇到的需求,传统的XmlDocument等方式操作起来较为繁琐,而LINQ to XML提供了更直观的查询语法,能够大幅简化XML数据的查询与处理流程。

LINQ to XML核心类介绍
使用LINQ to XML查询数据前,需要先了解几个核心类的作用:
- XDocument:表示整个XML文档,用于加载和保存XML内容,是操作XML的入口类。
- XElement:表示XML中的一个元素节点,可通过它获取元素的属性、子元素和文本内容。
- XAttribute:表示XML元素的一个属性,用于获取属性的值。
加载XML文档
首先需要引入LINQ to XML的命名空间,然后加载XML数据,加载方式分为从文件加载和从字符串加载两种。
引入命名空间的代码如下:
Imports System.Xml.Linq
从本地文件加载XML的示例代码:
' 加载本地XML文件 Dim xmlPath As String = "D:test.xml" Dim doc As XDocument = XDocument.Load(xmlPath)
从字符串加载XML的示例代码:
' 从字符串加载XML Dim xmlStr As String = "<?xml version=""1.0"" encoding=""utf-8""?><root><user id=""1"">张三</user><user id=""2"">李四</user></root>" Dim doc As XDocument = XDocument.Parse(xmlStr)
基础查询操作
查询所有元素
查询XML中所有指定名称的元素,使用Descendants方法即可,该方法会返回所有层级中匹配的元素集合。
示例XML内容如下:
<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="1001">
<name>王五</name>
<age>20</age>
<class>计算机1班</class>
</student>
<student id="1002">
<name>赵六</name>
<age>21</age>
<class>计算机2班</class>
</student>
</students>
查询所有<student>元素的代码:
Dim doc As XDocument = XDocument.Parse(xmlStr)
' 获取所有student元素
Dim allStudents = doc.Descendants("student")
For Each stu In allStudents
Console.WriteLine(stu.ToString())
Next
提取元素属性与文本内容
获取到元素后,可以通过Attribute方法获取属性,通过Value属性获取元素的文本内容,也可以通过Element方法获取子元素。
Dim doc As XDocument = XDocument.Parse(xmlStr)
Dim firstStudent = doc.Descendants("student").FirstOrDefault()
If firstStudent IsNot Nothing Then
' 获取id属性值
Dim stuId As String = firstStudent.Attribute("id").Value
' 获取name子元素的文本
Dim stuName As String = firstStudent.Element("name").Value
' 获取age子元素的文本
Dim stuAge As String = firstStudent.Element("age").Value
Console.WriteLine($"学号:{stuId},姓名:{stuName},年龄:{stuAge}")
End If
带条件的查询操作
LINQ to XML支持结合LINQ的Where条件进行筛选,实现复杂的查询需求。
单条件查询
查询年龄大于20岁的学生信息:
Dim doc As XDocument = XDocument.Parse(xmlStr)
' 查询年龄大于20的学生
Dim filterStudents = From stu In doc.Descendants("student")
Where CInt(stu.Element("age").Value) > 20
Select stu
For Each stu In filterStudents
Console.WriteLine($"姓名:{stu.Element("name").Value},年龄:{stu.Element("age").Value}")
Next
多条件查询
查询班级为计算机1班且年龄等于20岁的学生:
Dim doc As XDocument = XDocument.Parse(xmlStr)
' 多条件查询
Dim resultStudents = From stu In doc.Descendants("student")
Where stu.Element("class").Value = "计算机1班" AndAlso CInt(stu.Element("age").Value) = 20
Select New With {
.Id = stu.Attribute("id").Value,
.Name = stu.Element("name").Value,
.Age = stu.Element("age").Value,
.Class = stu.Element("class").Value
}
For Each item In resultStudents
Console.WriteLine($"学号:{item.Id},姓名:{item.Name},年龄:{item.Age},班级:{item.Class}")
Next
处理带命名空间的XML
如果XML文档带有命名空间,查询时需要先声明命名空间,否则无法匹配到对应的元素。
带命名空间的XML示例:
<?xml version="1.0" encoding="utf-8"?>
<students xmlns="http://www.ipipp.com/student">
<student id="1001">
<name>王五</name>
<age>20</age>
</student>
</students>
查询带命名空间XML的代码:
' 声明命名空间
Dim ns As XNamespace = "http://www.ipipp.com/student"
Dim doc As XDocument = XDocument.Parse(xmlStr)
' 查询时需要带上命名空间
Dim students = doc.Descendants(ns + "student")
For Each stu In students
Console.WriteLine($"姓名:{stu.Element(ns + "name").Value}")
Next
常见注意事项
- 获取属性或子元素时,需要先判断是否存在,避免出现空引用异常,比如使用
Attribute("id")?.Value的写法。 - XML中的数值类型文本,获取后需要根据实际类型做转换,转换前最好做合法性校验。
- 如果XML文档较大,尽量使用
Descendants按需查询,避免加载整个文档后做不必要的遍历。
VB.NETLINQ_to_XMLXML查询XDocument修改时间:2026-07-24 13:00:33