C# IOrderedEnumerable<;XElement>;返回NullReferenceException
我当前遇到一个问题,我从以下方法中获取了NullReferenceException:C# IOrderedEnumerable<;XElement>;返回NullReferenceException,c#,wpf,xml,C#,Wpf,Xml,我当前遇到一个问题,我从以下方法中获取了NullReferenceException: public void LoadValueXML() { XDocument myxml = XDocument.Load(@"config.xml"); Items = myxml.Element("Values").Elements("Item").OrderBy(x => x.Attribute("ID")); ItemsLength
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>
值
为空,项返回“枚举未产生结果”。它不再抛出异常,但仍然不起作用
编辑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.”异常。在属性上排序时,应添加
.Value
。您想按ID
的值排序,是吗
奇怪的是,我在你的代码中得到了一个ArgumentException
(至少有一个对象必须实现IComparable
),而不是NRE
Items = myxml.Element("Values")
.Elements("Item")
.OrderBy(x => x.Attribute("ID").Value);
或者如果您想要数字排序
OrderBy(x => Convert.ToInt32(x.Attribute("ID").Value);
按属性排序时,应添加
.Value
。您想按ID
的值排序,是吗
奇怪的是,我在你的代码中得到了一个ArgumentException
(至少有一个对象必须实现IComparable
),而不是NRE
Items = myxml.Element("Values")
.Elements("Item")
.OrderBy(x => x.Attribute("ID").Value);
或者如果您想要数字排序
OrderBy(x => Convert.ToInt32(x.Attribute("ID").Value);
当调试这样的东西时,考虑将每个链式方法调用断开到它自己的语句中。
var values = myxml.Element("Values");
var items = values.Elements("Item");
Items = items.OrderBy(x => x.Attribute("ID"));
异常点现在应该清楚地指出哪个方法返回NULL,并且您也可以检查调试器中的本地人来验证这一点。
< P>在调试这样的东西时,考虑将每个链式方法调用断开到它自己的语句中。var values = myxml.Element("Values");
var items = values.Elements("Item");
Items = items.OrderBy(x => x.Attribute("ID"));
异常所指向的行现在应该清楚地指示哪个方法返回null,并且您还可以检查调试器中的局部变量来验证这一点。每当我调试意外的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();
在调试器中像您已经在做的那样逐步处理该问题通常会揭示根本问题。每当我调试意外的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 LoadValueXML()
{
XDocument myxml = XDocument.Load("config.xml");
Items = myxml.Root.Elements("Item").OrderBy(x => (int)x.Attribute("ID"));
ItemsLength = Items.Count();
}
如果它不起作用,请告诉我尝试使用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();
}
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();
}
如果它不起作用,请告诉我public void loadXMl()
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();
}
{
字符串abcd=@”
";
XDocument myxml=XDocument.Load(abcd);//解析(abcd);
var Items=myxml.Element(“值”);
var abc=项目。要素(“项目”);
var ordered=abc.OrderBy(x=>int.Parse(x.Attribute(“ID”).Value));
var ItemsLength=ordered.Count();
}
public void loadXMl()
{
字符串abcd=@”
";
XDocument myxml=XDocument.Load(abcd);//解析(abcd);
var Items=myxml.Element(“值”);
var abc=项目。要素(“项目”);
var ordered=abc.OrderBy(x=>int.Parse(x.Attribute(“ID”).Value));
var ItemsLength=ordered.Count();
}
关于Parse()vs Load():文档开头是否有UTF-8 BOM?Load()可能是在将BOM表提供给解析器之前将其剥离出来,但将文件加载到字符串中的任何操作都不是将其剥离出来。Parse()是将XML本身作为字符串进行的。您需要将x.Attribute(“ID”).值解析为整数。查看我关于Parse()vs Load()的回答:文档开头是否有UTF-8 BOM?Load()可能是在将BOM表提供给解析器之前将其剥离出来,但将文件加载到字符串中的任何操作都不是将其剥离出来。Parse()是将XML本身作为字符串进行的。您需要将x.Attribute(“ID”).值解析为整数。看看我的答案,它仍然抛出同样的错误。最远的InnerException仍然是“对象引用未设置为对象的实例”。我按照cdhowie的建议将其拆分,然后NRE消失了。古怪的现在我只是好奇是什么导致了它。@ZachSmith那么您遇到的问题是Items
或ItemsLength
,而不是xml解析。。。它们从何而来?使用这些变量和我的代码(不带ToList()
)进行测试,结果非常理想。您确定给定的Xml就是您使用的Xml吗?@ZachSmith这是我在回答中遇到的错误。添加.Value
它仍然会抛出相同的错误。最远的InnerException仍然是“对象引用未设置为对象的实例”。我按照cdhowie的建议将其拆分,然后NRE消失了。古怪的现在我只是好奇是什么导致了它。@ZachSmith那么您遇到的问题是Items
或ItemsLength
,而不是xml解析。。。它们从何而来?使用这些变量和我的代码(不带ToList()
)进行测试,结果非常理想。您确定给定的Xml就是您使用的Xml吗?@ZachSmith这是我在回答中遇到的错误。Add.Value
真正奇怪的是,这不会引发异常。即使添加ItemsLength=Items.Count(),它仍然有效。@ZachSmith代码>?看起来它只是没有引发异常。我运行了调试器,在方法运行后,值被设置为null,项为空。@ZachSmith首先,尝试在OrderBy的末尾添加ToList()。告诉我们发生了什么。添加了ToList()。仍然得到“枚举未产生结果”。真正奇怪的是,这不会引发异常。即使添加ItemsLength=Items.Count(),它仍然有效。@ZachSmith代码>?看起来它只是没有引发异常。我运行了调试器,在方法运行后,值设置为null,项为空。@ZachSmith首先,尝试在命令末尾添加一个ToList()