2015-06-30 2 views
0

Как получить первый статус по его <StatusType> элементам <Code> является D. Этот LINQ работает, но re sharp говорит, что x.Element("StatusType") Возможная ошибка отображения nullreference.Исключение исключения элементов вложенного XML

var aaa = track.Descendants("Status") 
    .SingleOrDefault(x => x.Element("StatusType") != null && 
          x.Element("StatusType").Element("Code").Value == "D"); 

XML: -

<Activity> 
<ActivityLocation> 
<Address> 
<City>WILSLLE</City> 
<StateProvinceCode>oR</StateProvinceCode> 
<PostalCode>978880</PostalCode> 
<CountryCode>US</CountryCode> 
</Address> 
<Code>M7</Code> 
<Description>RECEIVER</Description> 
<SignedForByName>abc</SignedForByName> 
</ActivityLocation> 
<Status> 
<StatusType> 
<Code>D</Code> 
<Description>DELIVERED</Description> 
</StatusType> 
<StatusCode> 
<Code>KB</Code> 
</StatusCode> 
</Status> 
<Date>20150504</Date> 
<Time>085100</Time> 
</Activity> 
<Activity> 
<ActivityLocation> 
<Address> 
<City>TUALATIN</City> 
<StateProvinceCode>OR</StateProvinceCode> 
<CountryCode>US</CountryCode> 
</Address> 
</ActivityLocation> 
<Status> 
<StatusType> 
<Description>OUT FOR DELIVERY</Description> 
</StatusType> 
<StatusCode> 
<Code>DS</Code> 
</StatusCode> 
</Status> 
<Date>20150504</Date> 
<Time>045600</Time> 
</Activity> 

ответ

0

Проблема с кодом является то, что некоторые StatusType узел не содержит сам Code тега, таким образом, он будет возвращать нуль и .Value бросает пустую ссылку исключение. Лучше набирать текст следующим образом, потому что явные операторы литья гораздо безопаснее, чем доступ к свойству Value, поскольку он сначала проверяет на null.

var result = xdoc.Descendants("Status") 
       .SingleOrDefault(x => x.Element("StatusType") != null && 
          (string)x.Element("StatusType").Element("Code") == "D"); 

Кроме того, если вы уверены, что ваш запрос фильтр будет возвращать только один узел, только затем использовать SingleOrDefault иначе FirstOrDefault является лучшим вариантом.

Смежные вопросы