2016-01-20 4 views
0

Я пытаюсь проанализировать XML в моей модели домена. Ниже приводится часть кодаКак обрабатывать нулевые значения при разборе XML в C# .Net?

Customer customer = new Customer(); 

IEnumerable<XElement> elements = XElement.Load(xmlPath).Elements(); 

customer.ID = elements 
       .Where(n => n.Name.LocalName == "customers") 
       .Elements().Where(e => e.Name.LocalName == "id") 
       .FirstOrDefault().Value; 

Некоторое время XML не содержит раздел «клиент», так что первый .где() возвращает положение нулевой и дальнейшую обработку как .elements() ... заставляет его бросить исключение.

Вопрос о том, как я могу просто остановиться в первом .Where(), если я не раздел в XML не существует (то есть A null) и двигаться вперед, не получая исключения?

Я могу определенно сломать запрос Linq и использовать, если ... еще проверить это. Но есть ли эффективный и хороший способ сделать это?

ответ

0

Быстрое решение было бы сначала сделать запрос Linq, который находит все элементы, которые имеют название «клиенты», а затем поступят со второй половиной вашего запроса, если у вас есть 1 или более элементов для работы с:

elements = elements.Where(n => n.Name.LocalName.Equals("customers")); 
if (elements.Count() > 0) 
{ 
    customer.ID = elements.Elements().Where(e => e.Name.LocalName == "id").FirstOrDefault().Value; 
} 

У кого-то, у кого больше знаний Линка, может быть более элегантное решение.

+0

Это не будет работать. Потому что, прежде всего elements.Count() всегда> 0 из-за других разделов в XML присутствует. Во-вторых, во втором месте Where() для поиска «id» и, следовательно, null.FirstOrDefault() будет исключать значение null. – talaa123

+0

[Where() не возвращает null] (https://msdn.microsoft.com/library/bb549418 (v = vs.100) .aspx), только худший список с перечислимыми наименованиями, поэтому я подозреваю, что вы получаете исключение null указателя из другого места. Вероятно FirstOrDefault() возвращает null. – Chase

0

Where никогда не вернется null. FirstOfDefault будет, однако, а затем вызывая Value, выдает NullReferenceException.

Что вы должны сделать, это воспользоваться built in explicit conversions from XElement:

customer.ID = (string)elements 
    .Where(n => n.Name.LocalName == "customers") 
    .Elements() 
    .Where(e => e.Name.LocalName == "id") 
    .FirstOrDefault(); 

Если вам нужен только string, чуть более многословным альтернатива для выбора Value, а затем вызвать FirstOrDefault():

customer.ID = elements 
    .Where(n => n.Name.LocalName == "customers") 
    .Elements() 
    .Where(e => e.Name.LocalName == "id") 
    .Select(e => e.Value) 
    .FirstOrDefault(); 
Смежные вопросы