2015-09-30 3 views
0

Это НЕ вопрос об исключении NullReferenceException. Это вопрос о том, почему показанное заявление будет бросать одно, а что с ним не так.Проблема Анализ XML Documnet с Linq.Xml

Я пытаюсь разобрать небольшой документ XML с помощью Linq.Xml и я получаю нулевую ссылку исключение при попытке создать список объектов из запроса Linq

  _columnDefs = (from def in fileDef.Descendants("columndef") 
         select new ColumnDef() 
         { 
          Name = def.Attribute("Name").Value, 
          Type = def.Attribute("Type").Value, 
          Required = bool.Parse(def.Attribute("Required").Value), 
          Default = def.Attribute("Default").Value 
         }).ToList<ColumnDef>(); 

Кода здесь терпит неудачу с NullReferenceException как показано здесь

enter image description here

У меня возникли проблемы, пытаясь выяснить, если новый объект ColumDef является вопрос или что-то еще. Если это новый ColumnDef, то почему «новый» оператор не создает экземпляр объекта?

_columnDefs определяется как _columnDefs = new List<ColumnDef>();

+1

Возможный дубликат [Что такое исключение NullReferenceException и как его исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix- it) –

+0

Каждый узел 'columndef' содержит атрибуты' Name', 'Type',' Required', 'Default'? –

+0

@coderoipo - Они этого не делают. У меня сложилось впечатление, что он заполнит строковую переменную («По умолчанию» в этом случае является необязательным атрибутом) с нулевым значением и оставьте его на этом. Какой был бы лучший способ решить эту проблему? Могу ли я написать условный оператор внутри оператора Linq? – dscarr

ответ

1

Ваш взгляд отладчик показывает, что текущий элемент не имеет Default атрибут. Вы можете использовать default = (string)def.Attribute("Default"), чтобы иметь свойство null, если атрибут не существует.

+0

Если он использует C# 6, он также может добиться того же самого (и, возможно, дать читателю больше намека на то, что он знает, что это значение может быть нулевым) с помощью оператора нулевого распространения - def.Attribute («По умолчанию»)? .Value – TVOHM

+0

Благодаря @coderoipo, Martin и TVOHM за их ответы. coderoipo запустил меня в правильном направлении для поиска ответа, и Мартин и TVOHM указали, что я явно пропустил. Еще раз спасибо! – dscarr