XDocument Traversal - PullRequest
       13

XDocument Traversal

2 голосов
/ 09 декабря 2011

Я новичок в мире LINQ to XML.Я пытаюсь получить значение Identity, но только когда атрибут domain для Credential равен "NetworkID".Вот код, с которым я тестирую:

Фрагмент 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 выдаст ошибку, потому что я звоню .Descendants() на null.

Можно ли написать запрос так, чтобы он возвращал Identity или null, если какой-либо элемент не найден?

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011

Просто удалите FirstOrDefault() после Where():

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

Where() возвращает пустой набор результатов, а FirstOrDefault() в пустом наборе результатов возвращает ноль, поэтому .Where().FirstOrDefault().Descendants() вызвало исключение нулевой ссылки.

1 голос
/ 09 декабря 2011

Если вы используете

    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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...