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

何人かが提案したことを取り入れ、このような他の問題について研究した後、nullreference例外の問題を克服するには、以下に示すようにノードの値に明示的にアクセスする必要があることがわかりました

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 に答える