You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:54:12