C#解析XML提取嵌套元素时遇System.NullReferenceException异常求助
解决XML嵌套数据提取的NullReferenceException问题及正确实现
首先来说下你遇到的NullReferenceException的原因:你用DescendantNodes()遍历所有节点时,会包含XML里的空白文本节点(比如标签之间的换行、空格),这些节点无法转换成XElement,所以element会是null,当你访问element.Name的时候就触发了空引用异常。另外,原代码的逻辑完全没覆盖你要提取的PostalCode、Weight和Value——你只在处理desk节点的属性,但你的XML里desk本身没有任何属性,这部分逻辑完全无效。
下面是修正后的完整代码,不仅解决了异常,还实现了你需要的嵌套数据提取:
using System; using System.Collections.Generic; using System.IO; using System.Xml.Linq; class Program { static void Main(string[] args) { // 使用using语句自动管理流资源,无需手动Close string xmlContent; using (FileStream fs = new FileStream("Container.xml", FileMode.Open)) using (StreamReader sr = new StreamReader(fs)) { xmlContent = sr.ReadToEnd(); } List<Dictionary<string, string>> deskDataList = new List<Dictionary<string, string>>(); XDocument xDocument = XDocument.Parse(xmlContent); // 直接获取所有<desk>元素,跳过无关节点 foreach (XElement deskElement in xDocument.Descendants("desk")) { Dictionary<string, string> deskData = new Dictionary<string, string>(); // 提取Sender的邮政编码 string senderPostalCode = deskElement.Element("Sender")? .Element("Address")? .Element("PostalCode")? .Value; deskData.Add("SenderPostalCode", senderPostalCode ?? "N/A"); // 提取Participant的邮政编码 string participantPostalCode = deskElement.Element("participant")? .Element("Address")? .Element("PostalCode")? .Value; deskData.Add("ParticipantPostalCode", participantPostalCode ?? "N/A"); // 提取重量和价值 string weight = deskElement.Element("Weight")?.Value ?? "N/A"; string value = deskElement.Element("Value")?.Value ?? "N/A"; deskData.Add("Weight", weight); deskData.Add("Value", value); deskDataList.Add(deskData); } // 输出提取结果 foreach (var deskData in deskDataList) { Console.WriteLine($"Sender邮编: {deskData["SenderPostalCode"]}, Participant邮编: {deskData["ParticipantPostalCode"]}, 重量: {deskData["Weight"]}, 价值: {deskData["Value"]}"); } } }
代码关键点说明:
- 避免空引用:使用
?.空传播运算符,当某个父节点不存在时(比如万一某个desk没有Sender节点),不会抛出异常,而是返回null,再用??给默认值N/A - 精准定位节点:用
Descendants("desk")直接获取所有desk元素,不用遍历所有节点,效率更高也更安全 - 资源管理:用
using语句自动释放文件流,避免手动关闭可能导致的资源泄漏 - 明确数据区分:把Sender和Participant的邮政编码分开存储,符合你XML里的嵌套结构
运行结果示例:
Sender邮编: 2402AE, Participant邮编: 2497AV, 重量: 0.02, 价值: 0.0 Sender邮编: 2497GA, Participant邮编: 2353HS, 重量: 2.0, 价值: 0.0 Sender邮编: 2497GA, Participant邮编: 3035 AC, 重量: 100.0, 价值: 2000.0 Sender邮编: 2353HS, Participant邮编: 3035 AC, 重量: 11, 价值: 500
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

