2011-12-09 42 views
2

我是新来的LINQ to XML世界。我正在尝试检索Identity的值,但仅在Credentialdomain属性为“NetworkID”时才有效。下面是我与测试代码:XDocument遍历

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查询将会l产生错误,因为我打电话.Descendants()null

是否可以编写查询以便返回Identitynull如果找不到任何元素?

回答

3

Where()后,只需卸下FirstOrDefault()

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

Where()返回空的结果集和FirstOrDefault()对查询结果为空返回null这是为什么.Where().FirstOrDefault().Descendants()导致空引用异常。

1

如果使用

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

你应该得到你想要的。或者你需要打破代码,在第一部分做一个FirstOrDefault()例如

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