2016-02-21 6 views
1

Довольно новый для кодирования, не уверен, где я здесь ошибся. Приложение Строит, но сбой происходит во время выполнения с ошибкой: «Ссылка на объект не установлена ​​в экземпляр объекта».При создании экземпляра XmlDocument, почему я не могу использовать SelectSingleNode («String»). InnerText более одного раза?

Если я прокомментирую переменную test2 и второе условие, то приложение делает то, что я хочу. Когда я отказываюсь от комментариев выше, я получаю исключение.

В конце концов мне понадобится построить что-то подобное для 30-ти галочек.

Любая помощь была бы принята с благодарностью.

XmlDocument xDoc = new XmlDocument(); 

xDoc.Load(@"\\LEWBWPDEV\\ComplianceXmlStorage\\test.xml"); 
     string test1 = xDoc.SelectSingleNode("Introduction/Topic1").InnerText; 
     string test2 = xDoc.SelectSingleNode("Introduction/Topic2").InnerText; 

     if (test1 == "Yes") 
     { 
      checkBox1.CheckState = CheckState.Checked; 
     } 
     if (test2 == "Yes") 
     { 
      checkBox2.CheckState = CheckState.Checked; 
     } 

ответ

1

Это значит, что у вас нет Topic2 в вашем xml. Таким образом, xDoc.SelectSingleNode("Introduction/Topic2") возвращает null. Когда вы пытаетесь получить InnerText из null, вы получаете исключение.

Решение - проверьте значение null до получения InnerText.

var topic2 = xDoc.SelectSingleNode("Introduction/Topic2"); 
    if (topic2 != null && topic2.InnerText == "Yes") 
     checkBox2.CheckState = CheckState.Checked; 

Или вы можете использовать Null-conditional operator

string test2 = xDoc.SelectSingleNode("Introduction/Topic2")?.InnerText; 

ПРИМЕЧАНИЕ: Я предлагаю вам использовать Linq to XML для разбора XML

var xdoc = XDocument.Load(fileName); 
string test1 = (string)xdoc.XPathSelectElement("Introduction/Topic1"); 
string test2 = (string)xdoc.Root.Element("Topic2"); 

можно заливать элементы некоторых типов данных (например, строку или int), и он не будет генерировать исключение, если элемент отсутствует (если тип данных принимает nul л). Кроме того, если вам нужно обработать 30 узлов, вы можете легко получить все свои значения:

var topics = from t in xdoc.Root.Elements() 
      let name = t.Name.LocalName 
      where name.StartsWith("Topic") 
      select new { 
       Name = name, 
       IsEnabled = (string)t == "Yes" 
      }; 

Этот запрос возвращает коллекцию всех тем значений из вашего XML, который можно использовать для установки состояния флажков

[ 
    { Name: "Topic1", IsEnabled: false }, 
    { Name: "Topic2", IsEnabled: true } 
] 
+0

Спасибо за ответ. Таким образом, он проверяет, является ли узел не нулевым, и если он содержит строку текста. –

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

  • Нет связанных вопросов^_^