C#将XML文件解析并转换为Dictionary的方法

慢慢来
慢慢来
发布时间:2026-10-14 | 2人浏览过
原创

在C#开发中,经常需要将XML格式的配置数据转换为易于查找的字典结构。利用LINQ to XML提供的XDocument类,可以简便地加载XML文档并通过查询语法筛选节点,从而将特定的标签内容及其属性值打包存入Dictionary<string, string>中。

准备XML数据源

首先,需要准备好待解析的XML文件。假设该文件名为config.xml,其结构包含多个部门节点(如“国土局”),每个节点下有名称、编码、受理人、审核人等详细信息。以下是一个示例结构:

<?xml version="1.0" encoding="utf-8" ?>
<nodes>
  <国土局>
    <name>市局国土资源局</name>
    <code>330</code>
    <受理 telephone="88205156">萍,倩</受理>
    <审核 personId="48e1bca3-b0f5d0fec89">友</审核>
    <审定>123</审定>
    <BELONGSYSTEM>37001</BELONGSYSTEM>
    <DEPTID>10080100030</DEPTID>
    <SERVICECODE>4e58a6f1</SERVICECODE>
  </国土局>
</nodes>

使用LINQ to XML解析

核心思路是加载XML文档后,使用LINQ查询语句定位目标节点,并将其子节点的值及属性提取为匿名对象,最后遍历添加到Dictionary中。

第1步:加载XML文档

目的:读取本地XML文件到内存中。
入口:指定config.xml的文件路径。
动作:调用XDocument.Load方法。
重要参数:xmlPath字符串变量,指向XML文件所在绝对或相对路径。
完成状态:XDocument对象成功加载,无异常抛出。

第2步:编写查询表达式筛选节点

目的:根据条件(如市县编码)找到对应的XML节点。
入口:已加载的xd对象。
动作:使用LINQ从根节点的子元素中筛选出code值匹配传入参数的节点。
关键逻辑:

  • xd.Root.Descendants("国土局"):获取所有名为“国土局”的节点。
  • Where(p => p.Element("code").Value == p_shixianCode):筛选编码匹配的节点。
  • select new { ... }:投影出需要的字段,包括文本值和属性值(如telephone和personId)。

第3步:填充Dictionary

目的:将查询结果转换为键值对集合以便调用。
入口:上一步的查询结果集info。
动作:遍历结果集,将每个字段映射为Dictionary的Key-Value。
注意:需确保Key不重复,否则Add方法会报错。若预期多条记录,可能需要调整Key策略或使用List等其他结构。

完整实现代码

以下是具体的C#实现方法,可直接嵌入项目中使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

public static Dictionary<string, string> ShouLiInfo(string p_shixianCode)
{
    XDocument xd = null;
    string xmlPath = "config.xml"; // xml存放路径
    
    // 检查文件是否存在以避免异常
    if (!System.IO.File.Exists(xmlPath))
    {
        return new Dictionary<string, string>();
    }

    xd = XDocument.Load(xmlPath);

    Dictionary<string, string> pDic = new Dictionary<string, string&gt();
    
    // 查询匹配code的节点,提取所需字段
    var info = from t in xd.Root.Descendants("国土局")
               where t.Element("code")?.Value == p_shixianCode
               select new 
               { 
                   name = t.Element("name")?.Value,
                   code = t.Element("code")?.Value,
                   shouli = t.Element("受理")?.Value,
                   telephone = t.Element("受理")?.Attribute("telephone")?.Value,
                   shenhe = t.Element("审核")?.Value,
                   personId = t.Element("审核")?.Attribute("personId")?.Value,
                   shending = t.Element("审定")?.Value,
                   DEPTID = t.Element("DEPTID")?.Value,
                   BELONGSYSTEM = t.Element("BELONGSYSTEM")?.Value,
                   SERVICECODE = t.Element("SERVICECODE")?.Value
               };

    foreach (var item in info)
    {
        // 为防止null值导致问题,实际使用中建议做空值判断
        if (item.name != null) pDic.Add("name", item.name);
        if (item.code != null) pDic.Add("code", item.code);
        if (item.shouli != null) pDic.Add("shouliPerson", item.shouli);
        if (item.telephone != null) pDic.Add("telephone", item.telephone);
        if (item.shenhe != null) pDic.Add("shenhePerson", item.shenhe);
        if (item.personId != null) pDic.Add("shenhepersonId", item.personId);
        if (item.shending != null) pDic.Add("shendingPerson", item.shending);
        if (item.DEPTID != null) pDic.Add("DEPTID", item.DEPTID);
        if (item.BELONGSYSTEM != null) pDic.Add("BELONGSYSTEM", item.BELONGSYSTEM);
        if (item.SERVICECODE != null) pDic.Add("SERVICECODE", item.SERVICECODE);
    }
    return pDic;
}

注意事项与排错

Key冲突问题:原示例中直接添加所有字段到同一个Dictionary中。如果XML中存在多个同名节点(如多个“国土局”),循环执行pDic.Add时,若Key已存在则会抛出ArgumentException。本例假设仅匹配单个唯一节点,或业务逻辑允许覆盖/忽略后续重复Key。在实际多节点场景下,建议将结果存入List<Dictionary>或更改Key命名规则(如加入前缀区分)。

空引用异常:使用?.运算符(C# 6+)或在访问Element/Attribute前先判断!= null,可有效避免XML结构中缺失标签导致的运行时错误。

总结

通过以上步骤,我们实现了C#环境下XML到Dictionary的快速转换。该方法利用了LINQ to XML的简洁性,适合处理中小型配置文件的数据提取。以上就是C#针对XML文件转化Dictionary的详细内容,更多关于C# XML解析技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表