首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回NullReferenceException的IOrderedEnumerable<XElement>

返回NullReferenceException的IOrderedEnumerable<XElement>
EN

Stack Overflow用户
提问于 2013-07-12 22:54:24
回答 5查看 310关注 0票数 1

我目前遇到了一个问题,我从以下方法获取了一个NullReferenceException:

代码语言:javascript
复制
    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文档的格式如下:

代码语言:javascript
复制
<?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不为空,但是当我尝试设置项时,它仍然抛出异常。提前感谢您对解决此问题的任何帮助。

注意:尝试使用XDocument.Parse()而不是XDocument.Load()会返回一个"Data at the root level is invalid. Line 1, position 1."异常。

编辑:

遵循cdhowie的建议后,我当前的方法如下所示:

代码语言:javascript
复制
    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为空,并且items返回“枚举未产生结果”。它不再抛出异常,但它仍然不工作。

编辑2:

遵循Jeyaram J的建议的新方法:

代码语言:javascript
复制
    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”。异常。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-07-12 23:20:05

尝试使用Root而不是Element。

代码语言:javascript
复制
public void LoadValueXML()
{
    XDocument myxml = XDocument.Load("config.xml");
    Items = myxml.Root.Elements("Item").OrderBy(x => (int)x.Attribute("ID"));
    ItemsLength = Items.Count();
}

如果它不起作用,请告诉我

票数 2
EN

Stack Overflow用户

发布于 2013-07-12 22:59:34

在按属性排序时,应添加.Value。您希望按ID的值进行排序,不是吗?

奇怪的是,我有一个包含您的代码的ArgumentException (at least one object must implement IComparable),而不是NRE……

代码语言:javascript
复制
Items = myxml.Element("Values")
             .Elements("Item")
             .OrderBy(x => x.Attribute("ID").Value);

或者,如果您想要数字排序

代码语言:javascript
复制
OrderBy(x => Convert.ToInt32(x.Attribute("ID").Value);
票数 2
EN

Stack Overflow用户

发布于 2013-07-12 22:59:42

在调试这类东西时,请考虑将每个链式方法调用分解为其自己的语句。

代码语言:javascript
复制
var values = myxml.Element("Values");
var items = values.Elements("Item");
Items = items.OrderBy(x => x.Attribute("ID"));

异常所指向的行现在应该清楚地指示哪个方法返回了null,您还可以检查调试器中的本地变量来验证这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17617831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档