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