【问题标题】:NullReferenceException while parsing XML File [duplicate]解析 XML 文件时出现 NullReferenceException [重复]
【发布时间】:2013-09-17 18:49:23
【问题描述】:

我的目标:我想解析目录号 987654 的 XML 文件并将其显示在文本框中。我的 XML 文件如下所示:

<?xml version="1.0"?>
<!-- This file was generated by the installer. -->
<ModificationMap>
     <replace>
     <replace>
     <replace>
          <!-- Changed Serial Number and Product ID -->
          <text symbol="__EXAMPLE_SERIALNUMBER__">123456789</text>
          <text symbol="__EXAMPLE_CATALOGNUMBER__">987654</text>
          <text symbol="__MY_XMLPROGRAM__">300</text>
          <text symbol="__REGISTRATION_EXAMPLE__">20</text>
          <text symbol="__REGISTRATION_EXAMPLEVERSION__">20</text>
               <!-- Asset Profile -->
          <text symbol="__ASSET_MEMBERNAME__">MY_PROGRAM</text>
          <text symbol="__ASSET_FRIENDLYNAME__">XMLFile</text>
          <text symbol="__ASSET_DESCRIPTION__">XMLFile</text>
     </replace>
     <replace>
     <delete>
     <replace>
     <replace>
</ModificationMap>

代码:

    public Form1()
    {
        InitializeComponent();

        var dict = XDocument.Load(@"C:\Users\Smith\Desktop\example.xml")
        .Descendants("text")
        .ToDictionary(f => f.Attribute("__EXAMPLE_CATALOGNUMBER__").Value,
                      f => f.Attribute("symbol").Value);
        textBox1.Text = dict["__EXAMPLE_CATALOGNUMBER__"];
    }

我收到一条错误消息告诉我:

NullReferenceException 未处理。

我认为这种实现我的目标的方法是错误的。我是 C# 编码的新手。

【问题讨论】:

  • 您可以将 XML 发布为代码而不是图像吗?
  • 您是否正在尝试搜索具有symbol 属性和值为__REGISTRATION_CATALOGNUMBER__&lt;text&gt; 元素?
  • 您的意思是搜索 EXAMPLE_CATALOGNUMBER 吗?
  • @appcoder:是的,EXAMPLE_CATALOGNUMBER。我希望 987654 显示在文本框中。
  • NullReferenceException 的几乎所有情况都是相同的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

标签: c# xml xml-parsing nullreferenceexception


【解决方案1】:

问题是这段代码:

f.Attribute("__REGISTRATION_CATALOGNUMBER__").Value

没有名为__REGISTRATION_CATALOGNUMBER__ 的属性。现在,您可能希望按照以下方式做更多的事情:

f.Attributes().Where(a => a.Value == "__REGISTRATION_CATALOGNUMBER__")
    .First().Value;

但即便如此,我也不确定那会完成什么。

无论如何,f.Attribute("__REGISTRATION_CATALOGNUMBER__").Value 将抛出 NullReferenceException,因为 Attribute(...) 将返回 null

很可能您真正想要的是:

.ToDictionary(f => f.Attribute("symbol").Value,
              f => f.Value);

这会给你符号 -> 元素值 KVP。

【讨论】:

  • @Smith,但很可能其他一些 symbol 值会重复。通过在ToDictionary 之前添加Where 来缩小搜索范围,或者连接两个值(您必须弄清楚哪些值)以创建唯一键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
相关资源
最近更新 更多