xml ファイルを読み込んで、「meetsMark」= 1 のエントリを検索し、「sum」属性と「number」属性について、それらのエントリの「SUMMARY」要素をチェックするクエリを実行しています。出力には部屋ごとに返された「合計」と「数」の正確な数が表示されるため、コードはアイテムを正しく見つけているようです。ただし、「.Value」を呼び出さずに属性の値を返すにはどうすればよいですか。「.Value」を使用すると、これらの属性を持たないエントリがない限り機能し、null 例外が発生します。以下は私のコードで、xml スニップです。
List<string> test = new List<string>();
var groups = from x in doc.Descendants("GROUP")
where (string)x.Attribute("meetsMark") == "1"
select x;
foreach (var subgroup in groups)
{
//adds the code for any rooms found as 'ROOM: (Name)'
test.Add("ROOM: " + (string)subgroup.Attribute("code") + Environment.NewLine);
test.Add("ITEMS:" + Environment.NewLine);
var sums = from summary in subgroup.Descendants("SUMMARY")
select summary;
foreach (var sum in sums)
{
test.Add("sum = " + (string)subgroup.Attribute("sum"));
test.Add("number = " + (string)subgroup.Attribute("number"));
}
//add a blank line at the end to seperate each room
test.Add(Environment.NewLine);
}
var message = string.Join(Environment.NewLine, test);
MessageBox.Show(message);
これが読み取っているxmlです。
<?xml version="1.0" encoding="utf-8"?>
<GROUP id="GRP1">
<GROUP id="GRP2" code="MAIN" meetsMark="0">
<GROUP id="GRP3" code="Room1" meetsMark="1">
<ITEMS>
<ITEM id="ITM6">
<SUMMARY sum="Room1-Item1-Sum1" number="1"></SUMMARY>
</ITEM>
<ITEM id="ITM14">
<SUMMARY sum="Room1-Item2-Sum1" number="2"></SUMMARY>
</ITEM>
<ITEM id="ITM15">
<SUMMARY sum="Room1-Item3-Sum1" number="3"></SUMMARY>
</ITEM>
<ITEM id="ITM15">
<SUMMARY sum="Room1-Item4-Sum1" number="4"></SUMMARY>
</ITEM>
</ITEMS>
</GROUP>
<GROUP id="GRP4" code="Room2" meetsMark="1">
<ITEMS>
<ITEM id="ITM95">
<SUMMARY sum="Room2-Item1-Sum1" number="1"></SUMMARY>
</ITEM>
<ITEM id="ITM96">
<SUMMARY sum="Room1-Item2-Sum1" number="2"></SUMMARY>
</ITEM>
<ITEM id="ITM97">
<SUMMARY sum="Room1-Item3-Sum1" number="3"></SUMMARY>
</ITEM>
</ITEMS>
</GROUP>
</GROUP>
</GROUP>
部屋が返され、クエリしている各属性のスポットが表示されますが、それらの値は表示されません。これらの値を取得し、 .Value を呼び出して、クエリに一致する属性のないエントリにヒットさせることによって引き起こされる null 例外の問題を回避するにはどうすればよいですか?