1

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

4

1 回答 1

2

问题是这段代码:

f.Attribute("__REGISTRATION_CATALOGNUMBER__").Value

没有名为的属性__REGISTRATION_CATALOGNUMBER__。现在,您可能想要在这些方面做更多的事情:

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

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

无论如何, f.Attribute("__REGISTRATION_CATALOGNUMBER__").Valueis going to throw a NullReferenceExceptionbecause Attribute(...)is going to return null

您真正要寻找的很可能是这样的:

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

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

于 2013-09-17T19:01:17.307 回答