Выбор списка вложенных элементов в XML, которые могут существовать или не существовать - PullRequest
1 голос
/ 06 декабря 2010

То, что у меня есть, - это XML, который мы получаем от веб-сервиса, который представляет список вопросов. Вопросы разбиты по типу, который указывает, как они должны отображаться в Интернете. Например:

<step id="109025">
  <stepinf enabled="Yes" errors="0" id="First Name" mandatory="Yes" name="sti_115511" type="FIL">
    <field_label>First Name</field_label>
    <screen_value></screen_value>
  </stepinf>
  <stepinf enabled="Yes" errors="0" id="Last Name" mandatory="Yes" name="sti_115513" type="FIL">
    <field_label>Last Name</field_label>
    <screen_value></screen_value>
  </stepinf>
  <stepinf enabled="Yes" errors="0" id="State" mandatory="Yes" name="sti_109257" type="STE">
    <field_label>State</field_label>
    <screen_value></screen_value>
    <options_list>
      <option label="AK">AK - Alaska</option>
      <option label="AL">AL - Alabama</option>
      <option label="AR">AR - Arkansas</option>
      <option label="AS">AS - American Samoa (Terr.)</option>
      <option label="AZ">AZ - Arizona</option>
      ...
    </options_list>
  </stepinf>
</step>

Тип "STE" указывает, что он будет отображаться в Интернете как поле выбора.

Я заполняю список <> пользовательского типа, который я создал, выполнив следующие действия:

var stepinfList = (from stepinf in xdoc.Descendants("stepinf")
    select new Question
    {
       TextID = stepinf.Attribute("id").Value,
       Type = stepinf.Attribute("type").Value,
       Name = stepinf.Attribute("name").Value,
       Label = stepinf.Element("field_label").Value,
       Required = stepinf.Attribute("mandatory").Value,
       ErrorCount = int.Parse(stepinf.Attribute("errors").Value)
    }).ToList();

Где я заблудился, я понятия не имею, как включить подэлементы опций в мои результаты. Я попытался создать свойство в типе вопроса с именем Options, которое я определил как IDictionary, а затем использовал дополнительный выбор в моем запросе LINQ и расширение ToDictionary.

Options = (from option in xdoc.Element("options_list").Elements("option")
    select option)
    .ToDictionary(x => x.Attribute("label").Value, x => x.Value)

Это не сработало, так как я думаю, что это бомбы в записях stepinf, которые не имеют дочерних элементов option_list. В любом случае, я получаю «Ссылка на объект не установлена ​​на экземпляр объекта» в операторе LINQ при запуске страницы.

Боюсь, это выше моего текущего набора навыков LINQ, поэтому любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 06 декабря 2010

Это не сработало, так как я думаю, что это бомбы для записей stepinf, которые не имеют дочерних элементов option_list.

Ваша оценка верна, поэтому вам нужно проверить, является ли option_list существует до запроса.Проверьте, является ли оно нулевым, и верните словарь или верните нулевое значение соответственно.

Попробуйте это:

Options = stepinf.Element("options_list") == null ? null :
              stepinf.Element("options_list").Elements("option")
                     .ToDictionary(x => x.Attribute("label").Value, x => x.Value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...