在C#中使用LINQ-To-XML解析含多列表与类对象的XML数据
用LINQ-To-XML解析员工信息XML的完整指南
没问题,我来一步步教你搞定这个XML解析的需求。首先咱们先把你给出的不完整XML补全成合法的结构(XML要求标签闭合),方便后续演示:
<EmployeeDetails> <Employee> <!--员工列表--> <Id>11</Id> <name>a</name> <Dependents> <!--单个员工的家属列表--> <Dependent> <name>a1</name> <age>50</age> </Dependent> <Dependent> <name>a2</name> <age>52</age> </Dependent> </Dependents> <Department> <!--每位员工唯一的部门信息--> <DeptId>1</DeptId> <DeptName>技术部</DeptName> </Department> </Employee> <!--额外加一个员工示例,方便测试多数据场景--> <Employee> <Id>12</Id> <name>b</name> <Dependents> <Dependent> <name>b1</name> <age>10</age> </Dependent> </Dependents> <Department> <DeptId>2</DeptId> <DeptName>市场部</DeptName> </Department> </Employee> </EmployeeDetails>
第一步:定义对应的C#实体类
首先咱们创建和XML结构匹配的实体类,这样解析出来的数据能直接映射到对象中,方便后续业务处理:
// 家属信息类 public class Dependent { public string Name { get; set; } public int Age { get; set; } } // 部门信息类 public class Department { public int DeptId { get; set; } public string DeptName { get; set; } } // 员工信息主类 public class Employee { public int Id { get; set; } public string Name { get; set; } public List<Dependent> Dependents { get; set; } public Department Department { get; set; } }
第二步:用LINQ-To-XML解析XML
接下来就是核心的解析逻辑了,我们用XDocument类来加载XML文件(或者XML字符串),然后通过LINQ查询提取每个节点的数据:
using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; class Program { static void Main() { // 方式1:加载本地XML文件 // var xDoc = XDocument.Load(@"你的XML文件路径\EmployeeDetails.xml"); // 方式2:直接解析XML字符串(适合快速测试) string xmlContent = @"上面的完整XML内容"; var xDoc = XDocument.Parse(xmlContent); // 解析所有员工信息 List<Employee> employees = xDoc.Descendants("Employee") .Select(emp => new Employee { Id = int.Parse(emp.Element("Id").Value), Name = emp.Element("name").Value, // 解析下属的家属列表 Dependents = emp.Descendants("Dependent") .Select(dep => new Dependent { Name = dep.Element("name").Value, Age = int.Parse(dep.Element("age").Value) }).ToList(), // 解析员工的部门信息 Department = emp.Descendants("Department") .Select(dept => new Department { DeptId = int.Parse(dept.Element("DeptId").Value), DeptName = dept.Element("DeptName").Value }).FirstOrDefault() }).ToList(); // 输出解析结果,验证是否正确 foreach (var emp in employees) { Console.WriteLine($"员工ID:{emp.Id},姓名:{emp.Name}"); Console.WriteLine($"所在部门:{emp.Department.DeptName}(ID:{emp.Department.DeptId})"); Console.WriteLine("家属列表:"); foreach (var dep in emp.Dependents) { Console.WriteLine($"- 姓名:{dep.Name},年龄:{dep.Age}"); } Console.WriteLine("------------------------"); } } }
一些关键注意事项
- 大小写匹配:XML是大小写敏感的,比如XML里的
<name>不能写成Element("Name"),必须严格对应标签名,否则会找不到元素。 - 空元素处理:如果某个员工可能没有家属,建议在解析家属列表时加上
DefaultIfEmpty(),避免出现空引用异常:Dependents = emp.Descendants("Dependent") .Select(dep => new Dependent { ... }) .DefaultIfEmpty() .ToList() - 命名空间处理:如果你的XML带有命名空间(比如
<EmployeeDetails xmlns="http://example.com">),需要先定义命名空间再查询:XNamespace ns = "http://example.com"; var employees = xDoc.Descendants(ns + "Employee")...
内容的提问来源于stack exchange,提问作者Harshil Doshi
相关产品推荐
相关产品推荐

