2011-12-09 14 views
2

私は新しいLINQ to XMLの世界です。私はIdentityの値を取得しようとしていますが、domainの属性がCredentialの場合にのみ "NetworkID"です。XDocument Traversal

XMLスニペット:

<Sender> 
    <Credential domain="NetworkID"> 
    <Identity>MyIdentity</Identity> 
    <SharedSecret>MySharedSecret</SharedSecret> 
    </Credential> 
    <UserAgent>MyUserAgent</UserAgent> 
</Sender> 

C#:

var credential = xdoc.Descendants("Sender") 
     .Elements("Credential") 
     .Where(x => x.Attribute("domain").Value == "NetworkID").FirstOrDefault() 
     .Descendants("Identity").FirstOrDefault(); 

質問:明らかに

Credentialノードの場合をここで私がテストしてるコードですが見つかりません、LINQクエリwil私はnull.Descendants()を呼び出しているのでエラーが発生します。

どちらの要素も見つからない場合は、Identityまたはnullを返すようにクエリを記述できますか?

答えて

3

だけWhere()FirstOrDefault()を削除:

var credential = xdoc.Descendants("Sender") 
        .Elements("Credential") 
        .Where(x => x.Attribute("domain").Value == "NetworkID") 
        .Descendants("Identity") 
        .FirstOrDefault(); 

Where()を返す空の結果セットとFirstOrDefault()を空の結果セットを返すには、.Where().FirstOrDefault().Descendants()がnull参照の例外を発生させた理由ですヌル。

1

あなたは

var identity = 
     xdoc.Descendants("Sender") 
     .Elements("Credential") 
     .Where(x => (string)x.Attribute("domain") == "NetworkID") 
     .Descendants("Identity") 
     .FirstOrDefault(); 

を使用する場合は、あなたが望む結果を得る必要があります。または、最初の部分で1つのFirstOrDefault()を実行してコードを分割する必要があります。

var credential = xdoc.Descendants("Sender").Elements("Credential").FirstOrDefault(c => (string)c.Attribute("domain") == "NetworkID"); 
    var identity = credential != null ? credential.Element("Identity") : null;