2009-06-04 5 views
3

次のコードは、XMLの各要素が「Id」属性を持つ場合にのみ機能します。存在しない属性を無視するようにLINQに指示するにはどうすればよいですか?

ただし、要素にid属性がない場合、LINQはNullReferenceExceptionをスローします。

Id属性がない場合は、空白または空白を割り当てるだけです。

using System; 
using System.Linq; 
using System.Xml.Linq; 

namespace TestXmlElement2834 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      XElement content = new XElement("content", 
       new XElement("item", new XAttribute("id", "4")), 
       new XElement("item", new XAttribute("idCode", "firstForm")) 
       ); 

      var contentItems = from contentItem in content.Descendants("item") 
           select new ContentItem 
           { 
            Id = contentItem.Attribute("id").Value 

           }; 

      foreach (var contentItem in contentItems) 
      { 
       Console.WriteLine(contentItem.Id); 
      } 

      Console.ReadLine(); 


     } 
    } 

    class ContentItem 
    { 
     public string Id { get; set; } 
     public string IdCode { get; set; } 
    } 
} 
+0

(よりよい方法で見つかった - 更新を参照) –

答えて

7

(第二編集)

ああ - これは


など XAttributeに柔軟な静的変換演算子のおかげで動作します

from contentItem in content.Descendants("item") 
    select new ContentItem 
    { 
     Id = (string)contentItem.Attribute("id") 
    }; 

;-p簡単な方法を見つけました

(オリジナル)

from contentItem in content.Descendants("item") 
    let idAttrib = contentItem.Attribute("id") 
    select new ContentItem 
    { 
     Id = idAttrib == null ? "" : idAttrib.Value 
    }; 

(第一編集)

または拡張メソッドを追加:

static string AttributeValue(this XElement element, XName name) 
{ 
    var attrib = element.Attribute(name); 
    return attrib == null ? null : attrib.Value; 
} 

と使用を:

from contentItem in content.Descendants("item") 
    select new ContentItem 
    { 
     Id = contentItem.AttributeValue("id") 
    }; 
+0

はい、いい、私は3次演算子を試していたが、それが動作しなかった "let"なしで、ありがとう –

+0

は、(文字列)鋳造作品、優れた –

関連する問題