【发布时间】:2013-07-12 14:54:23
【问题描述】:
我目前遇到的问题是通过以下方法获得 NullReferenceException:
public void LoadValueXML()
{
XDocument myxml = XDocument.Load(@"config.xml");
Items = myxml.Element("Values").Elements("Item").OrderBy(x => x.Attribute("ID"));
ItemsLength = Items.Count();
}
我尝试设置 Items 变量的方法的第四行正在生成异常。我的 XML 文档格式如下:
<?xml version="1.0" encoding="utf-8" ?>
<Values>
<Item ID="1" Type="Command" Value="330MV,60HZ"/>
<Item ID="2" Type="Command" Value="600MV,13KHZ"/>
<Item ID="3" Type="Command" Value="3.3V,60HZ"/>
<Item ID="4" Type="Notification" Value="Look At This!!!" />
</Values>
我似乎找不到问题所在。看起来一切都很好地加载到 XDocument 中。在调试器中,它显示 XDocument 不为空,但是当我尝试设置 Items 时,它仍然会引发异常。提前感谢您为解决此问题提供的任何帮助。
附带说明:尝试使用 XDocument.Parse() 而不是 XDocument.Load() 会返回 "Data at the root level is invalid. Line 1, position 1." 异常。
编辑:
在听从 cdhowie 的建议后,我目前的方法如下所示:
public void LoadValueXML()
{
XDocument myxml = XDocument.Load(@"config.xml");
var values = myxml.Element("Values");
var items = values.Elements("Item");
Items = items.OrderBy(x => x.Attribute("ID"));
ItemsLength = Items.Count();
}
values 为 null 并且项目正在返回“枚举未产生任何结果”。它不再抛出异常,但仍然无法正常工作。
编辑 2:
遵循 Jeyaram J 建议的新方法:
public void LoadValueXML()
{
XDocument myxml = XDocument.Load(@"config.xml");
var items = myxml.Root.Elements("Item");
Items = items.OrderBy(x => x.Attribute("ID"));
ItemsLength = Items.Count();
}
它可以部分工作,但会抛出“至少一个对象必须实现 IComparable”。例外。
【问题讨论】:
-
关于 Parse() 与 Load():文档开头是否有 UTF-8 BOM?也许 Load() 在将 BOM 提供给解析器之前将其剥离,但无论您使用什么将文件加载到字符串中,都不会将其剥离。
-
Parse() 用于 XML 本身作为字符串。
-
您需要将 x.Attribute("ID").Value 解析为整数。看看我的回答