解析XML文件时出现NullReferenceException

时间:2013-09-17 18:49:23

标签: c# xml xml-parsing nullreferenceexception

我的目标:我想解析目录号 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#编码的新手。

1 个答案:

答案 0 :(得分:2)

问题是这段代码:

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);

会给你一个符号 - &gt;元素值KVP。