在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
相关产品推荐
相关产品推荐

