0

我正在尝试从 xml 文件导入数据并按顺序对它们进行排序,但是当我运行它时,我得到“对象引用未设置为对象的实例”。这是我正在使用的代码片段。

XElement data = XElement.Load("blockData.xml");

var sortedElements = 
from c in data.Element("BLOCKS").Elements("BLOCK")
orderby (string)c.Element("X") descending,
        (string)c.Element("Y") descending,
        (string)c.Element("Z") descending
        select new
        {
            name1 = (string)c.Element("NAME"),
            X1 = (string)c.Element("X"),
            Y1 = (string)c.Element("Y"),
            Z1 = (string)c.Element("Z")
        };
 foreach (var r in sortedElements)
 Console.WriteLine("X:{0} Y:{1} Z:{2} Name:{3}",
          r.X1, r.Y1, r.Z1, r.name1);

以及 XML 文件中包含的内容的示例

<BLOCKS>
  <BLOCK>
   <NAME>B1</NAME>
   <X>0</X>
   <Y>0</Y>
   <Z>0</Z>
  </BLOCK>
</BLOCKS>
4

2 回答 2

0

尝试:

var sortedElements = 
from c in data.Root.Elements("BLOCK")

因为 BLOCKS 是 XML 的根。

于 2012-05-09T12:29:27.143 回答
-1

在接受了你们中的一些人的建议并研究了类似这样的其他问题之后,我发现您需要显式访问节点的值,如下所示,以克服空引用异常的问题

var sortedElements =
    from c in data.DescendantsAndSelf("BLOCKS").Elements("BLOCK")
    orderby 
         c.Element("X").Value descending,
         c.Element("Y").Value descending,
         c.Element("Z").Value descending
    select new
    {
        name1 = (string)c.Element("NAME"),
        X1 = (string)c.Element("X"),
        Y1 = (string)c.Element("Y"),
        Z1 = (string)c.Element("Z")
    };
    foreach (var r in sortedElements)
    Console.WriteLine("X:{0} Y:{1} Z:{2} Name:{3}",
           r.X1, r.Y1, r.Z1, r.name1);              

以及将根元素添加到 XML 文件

<root>

    <BLOCKS> . . . </BLOCKS>

</root>
于 2012-05-10T07:41:39.230 回答