1

我目前遇到一个问题,我从以下方法获得 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 并且 items 正在返回“枚举未产生任何结果”。它不再抛出异常,但仍然无法正常工作。

编辑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”。例外。

4

5 回答 5

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();
}

让我知道它是否不起作用

于 2013-07-12T15:20:05.080 回答
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);
于 2013-07-12T14:59:34.173 回答
2

在调试这样的事情时,请考虑将每个链接的方法调用分解为自己的语句。

var values = myxml.Element("Values");
var items = values.Elements("Item");
Items = items.OrderBy(x => x.Attribute("ID"));

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

于 2013-07-12T14:59:41.817 回答
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();

像您已经在做的那样在调试器中单步执行通常会揭示根本问题。

于 2013-07-12T15:02:43.553 回答
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();
        }
于 2013-07-12T15:20:48.770 回答