我目前遇到的问题是我从以下方法获得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.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
为空且项目返回“枚举未产生结果”。它不再抛出异常,但它仍无效。
编辑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”。异常。
答案 0 :(得分:2)
在属性订购时,您应该添加.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);
答案 1 :(得分:2)
在调试这样的事情时,请考虑将每个链式方法调用分解为自己的语句。
var values = myxml.Element("Values");
var items = values.Elements("Item");
Items = items.OrderBy(x => x.Attribute("ID"));
异常指向的行现在应该清楚地指示哪个方法返回null,并且您还可以检查调试器中的locals来验证这一点。
答案 2 :(得分:2)
尝试使用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();
}
如果它不起作用,请告诉我
答案 3 :(得分:1)
每当我调试意外的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();
在调试器中逐步执行此操作通常会显示根本问题。
答案 4 :(得分:0)
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();
}