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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:22:33