2011-08-08 7 views
3

私は、類似の属性に基づいて別の名前を選択しようとしているLinqToXML式を持っています。コードは偉大な働いていると私は以下にそれを入れている:LinqToXML式のヌル属性をチェックする方法は?

  var q = xmlDoc.Element("AscentCaptureSetup").Element("FieldTypes") 
      .Descendants("FieldType") 
      .Select(c => new { width = c.Attribute("Width").Value, 
           script = c.Attribute("ScriptName").Value, 
           sqlType = c.Attribute("SqlType").Value, 
           enableValues = c.Attribute("EnableValues").Value, 
           scale = c.Attribute("Scale").Value, 
           forceMatch = c.Attribute("ForceMatch").Value, 
           forceMatchCaseSensitive = c.Attribute("ForceMatchCaseSensitive").Value, 
           sortAlphabetically = c.Attribute("SortAlphabetically").Value, 
          }) 
      .Distinct(); 

ないすべての属性が必要とされているので、問題が発生し、そのうちの一つが省略された場合、sortAlphabeticallyたとえばのために、私はオブジェクトではない取得参照されたエラー。意味はありますが、属性が実際に存在する場合にのみ新しい値を割り当てるようにクエリを変更する方法がありますか? (null参照に爆破されます)Valueプロパティを使用する代わりに

答えて

5

を(これにより任意のnullポインタエラーをバイパスして)、単純に文字列にXAttributeをキャスト - あなたよいずれか取得値、またはXAttributeの参照がnullの場合はnull参照。 (XElementは同じように動作し、これはNULL可能タイプにすべての変換に適用されます。)

だから、あなたは持っていると思います:

.Select(c => new { 
    width = (string) c.Attribute("Width"), 
    script = (string) c.Attribute("ScriptName"), 
    sqlType = (string) c.Attribute("SqlType"), 
    enableValues = (string) c.Attribute("EnableValues"), 
    scale = (string) c.Attribute("Scale"), 
    forceMatch = (string) c.Attribute("ForceMatch"), 
    forceMatchCaseSensitive = (string) c.Attribute("ForceMatchCaseSensitive"), 
    sortAlphabetically = (string) c.Attribute("SortAlphabetically"), 
}) 

これらの属性のいくつかは、彼らが実際int?にキャストする必要がありますように聞こえますまたはbool?、お気軽に

+0

Doh!あなたはコーヒーを飲みましたが、私はしませんでした。キャストに良いキャッチは、素晴らしい仕事をするでしょう。これまでのところ、キャストの型は重要ではありません。これらの変数はログ出力を作成するためにのみ使用されます。ありがとうジョン –

関連する問題