2008年01月23日

Linq to XML その8

   このエントリーをはてなブックマークに追加 Clip to Evernote
Linq to XML その7

XMLファイルの中に、

  <Person>
<Name>高杉晋作</Name>
<Age>21</Age>
</Person>


という要素があったとします。
今までと違うのは、IsReal属性がない点です。
この要素があるXMLファイルを処理すると、今までのプログラム(以下)だと例外が発生してしまいました。

XDocument xdoc = XDocument.Load("people.xml");
foreach (var xperson in xdoc.Root.Elements()) {
bool isReal = (bool)xperson.Attribute("IsReal"); //★
if (isReal) {
XElement xname = xperson.Element("Name");
XElement xage = xperson.Element("Age");
Console.WriteLine(xname.Value + ":" + xage.Value + "歳");
}
}


で、このプログラムを改良してみました。
IsReal属性がない場合、 trueが指定されているものとして処理を継続することにします。

★の行を以下のように書き換えるだけです。

bool isReal = (bool?)xperson.Attribute("IsReal") ?? true;


?? は null合体演算子といって、値が null だった場合に、??に続く値を利用するという指定です。もちろん、nullableタイプのみに利用できます。

この場合は、xperson.Attribute("IsReal") を (bool?) nullを許容する bool型にキャストし、その結果が nullだったら(つまり、IsReal属性がなかったら)、trueとして評価することになります。

クエリ式を使った場合も同様です。

XDocument xdoc = XDocument.Load("people.xml");
var query = from xperson in xdoc.Root.Elements()
where (bool?)xperson.Attribute("IsReal") ?? true == true
select new {
Name = xperson.Element("Name").Value,
Age = (int)xperson.Element("Age")
};
foreach (var p in query)
Console.WriteLine(p.Name + ":" + p.Age + "歳");


nullableってC#2.0のときには、なかなか使う場面がなかったけど、C#3.0になって俄然その存在感が増したように思います。



この記事へのコメント
LINQ to XMLその9
http://blog.livedoor.jp/gushwell/archives/51375061.html
Posted by LINQ to XMLその9 at 2008年04月19日 20:18
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51364699