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

在C#中使用Dictionary存储与访问XML元素的实现求助

解决XML节点转Dictionary的问题

首先看你的XML结构,是Subject下嵌套Book,Book里有几个子节点对应具体值。你原来的代码只处理了元素节点,但节点的实际文本值是在Text类型的节点里,而且逻辑绕得有点复杂,完全没必要用计数器和布尔变量来控制。我给你两种可行的实现方式:


推荐方案:用LINQ to XML(更简洁易维护)

现在.NET里处理XML更推荐用XDocument(LINQ to XML),代码量少逻辑清晰,一行LINQ就能搞定需求:

using System.Xml.Linq;

// 加载目标XML文件
XDocument xmlDoc = XDocument.Load("myxmlfile.xml");

// 提取Book节点下的所有子元素,直接转成Dictionary
Dictionary<string, string> bookData = xmlDoc.Descendants("Book")
    .Elements()
    .ToDictionary(elem => elem.Name.LocalName, elem => elem.Value);

// 测试访问,比如获取书名和出版年份
Console.WriteLine($"书名:{bookData["Name"]}"); // 输出 书名:ASP.NET
Console.WriteLine($"出版年份:{bookData["Published"]}"); // 输出 出版年份:2018

如果你坚持用XmlTextReader

要是你不想换处理方式,那得修复原来的代码逻辑:需要捕获Text节点来获取值,同时记录当前的元素名称,这样才能把节点名和值对应起来:

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

XmlTextReader reader = new XmlTextReader("myxmlfile.xml");
Dictionary<string, string> dict = new Dictionary<string, string>();
string currentNodeName = string.Empty;

while (reader.Read())
{
    switch (reader.NodeType)
    {
        // 遇到元素节点时,记录当前节点的名字
        case XmlNodeType.Element:
            currentNodeName = reader.Name;
            break;
        // 遇到文本节点时,把节点名和对应值存入字典
        case XmlNodeType.Text:
            if (!string.IsNullOrWhiteSpace(currentNodeName) && !dict.ContainsKey(currentNodeName))
            {
                dict.Add(currentNodeName, reader.Value);
            }
            currentNodeName = string.Empty; // 重置节点名,防止重复添加
            break;
    }
}

// 测试弹窗显示书籍价格
MessageBox.Show(dict["Price"]);

为啥原来的代码不行?

你原来的代码只处理了Element类型的节点,但像<Name>ASP.NET</Name>这种结构里,Name是元素节点,ASP.NET是单独的文本节点,你根本没读取这个文本节点的内容,自然拿不到对应值。另外那些count和Name变量的逻辑完全冗余,反而把代码搞复杂了。

内容的提问来源于stack exchange,提问作者Virat ABD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:44:31