IOrderedEnumerable<XElement> returning NullReferenceEx
本文关键字:returning NullReferenceEx gt XElement IOrderedEnumerable lt | 更新日期: 2023-09-27 18:22:11
我目前遇到一个问题,从以下方法中得到一个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不是null,但当我尝试设置Items时,它仍然抛出异常。提前感谢您为解决此问题提供的任何帮助。
附带说明:尝试XDocument.Passe()而不是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。"异常。
尝试使用Root而不是Element。
public void LoadValueXML()
{
XDocument myxml = XDocument.Load("config.xml");
Items = myxml.Root.Elements("Item").OrderBy(x => (int)x.Attribute("ID"));
ItemsLength = Items.Count();
}
如果它不工作,请告诉我
在调试类似的东西时,考虑将每个链式方法调用分解为自己的语句。
var values = myxml.Element("Values");
var items = values.Elements("Item");
Items = items.OrderBy(x => x.Attribute("ID"));
异常所指向的行现在应该清楚地指示哪个方法返回了null,并且您还可以检查调试器中的本地程序来验证这一点。
在对属性进行排序时,应该添加.Value
。你想按ID
的值排序,不是吗?
奇怪的是,我有一个ArgumentException
和你的代码(at least one object must implement IComparable
),而不是NRE
。。。
Items = myxml.Element("Values")
.Elements("Item")
.OrderBy(x => x.Attribute("ID").Value);
或者如果你想要数字排序
OrderBy(x => Convert.ToInt32(x.Attribute("ID").Value);
每当我调试意外的LINQ问题时,我的第一步通常是分解每个单独的步骤。例如:
var document = XDocument.Load(@"config.xml");
var valuesElement = document.Element("Values");
var itemElements = valuesElement.Elements("Item");
var idAttributes = itemElements.Select(x => x.Attribute("ID"));
var orderedItems = itemElements.OrderBy(x => x.Attribute("ID"));
var orderedItemsCount = orderedItems.Count();
像您已经做过的那样在调试器中逐步完成它通常会揭示根本问题。
public void loadXMl()
{
string abcd = @"<?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 myxml = XDocument.Load(abcd);//Parse(abcd);
var Items = myxml.Element("Values");
var abc = Items.Elements("Item");
var ordered = abc.OrderBy(x => int.Parse(x.Attribute("ID").Value));
var ItemsLength = ordered.Count();
}