2015-05-20 3 views
0

Я получаю nullreferenceexception с помощью htmlagilitypack, когда мой поиск ничего не возвращает. Мне нужно знать, как справиться с этим в коде. Я пытаюсь использовать ??, но я не использую его правильно и не совсем уверен, как его использовать. Я просто хочу знать, как запустить некоторый метод, если nodes пуст. Возможно, я просто проверил бы с IF, если нет лучшего способа.Обработка nullreferenceexception с htmlagilitypack

public DataTable tableIntoTable(HtmlDocument doc) 
    { 
     var table = new DataTable("MyTable"); 
     table.Columns.Add("raw", typeof(string)); 
     var xpath = @"//th[@class='ddlabel'] | //table[not(.//*[contains(@*,'pldefault') or contains(@*,'ntdefault') or contains(@*,'bgtabon')])]"; 
     var nodes = doc.DocumentNode.SelectNodes(xpath); 
     foreach (var node in nodes ?? new HtmlAgilityPack.HtmlNodeCollection {null}) 
     //new is underlined in red, not sure how it's supposed to work 
     { 
      table.Rows.Add(node.InnerHtml); 
     } 


     return table; 
    } 
+0

возможного дубликата (HTTP://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Jehof

+0

Почему вы не пытаетесь использовать только этот 'foreach (узел var в узлах) // new is подчеркнуто красным, не уверен, как он должен работать { table.Rows.Add (node.InnerHtml); } ' –

ответ

1

Ну, если исключение вызвано nodes быть пустым, то не пытайтесь итерацию через него, если она равна нулю.

public DataTable tableIntoTable(HtmlDocument doc) 
{ 
    var table = new DataTable("MyTable"); 
    table.Columns.Add("raw", typeof(string)); 
    var xpath = @"//th[@class='ddlabel'] | //table[not(.//*[contains(@*,'pldefault') or contains(@*,'ntdefault') or contains(@*,'bgtabon')])]"; 
    var nodes = doc.DocumentNode.SelectNodes(xpath); 

    // Don't iterate if nodes is null. 
    if (nodes != null) 
    { 
     foreach (var node in nodes) 
     { 
      table.Rows.Add(node.InnerHtml); 
     } 
    } 

    return table; 
} 
0

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

public DataTable tableIntoTable(HtmlDocument doc) 
     { 
      var table = new DataTable("MyTable"); 
      table.Columns.Add("raw", typeof(string)); 
      var xpath = @"//th[@class='ddlabel'] | //table[not(.//*[contains(@*,'pldefault') or contains(@*,'ntdefault') or contains(@*,'bgtabon')])]"; 
      var nodes = doc.DocumentNode.SelectNodes(xpath); 
      if (nodes != null && nodes.Count > 0) 
      { 
       foreach (var node in nodes) 
       { 
        table.Rows.Add(node.InnerHtml); 
       } 
      } 

      return table; 
     } 
-2

Не добавляйте чек, если вы перебор nodes с помощью foreach цикла. Он просто пропустит цикл, если узлами являются null.

public DataTable tableIntoTable(HtmlDocument doc) 
{ 


    var table = new DataTable("MyTable"); 
    table.Columns.Add("raw", typeof(string)); 
    var xpath = @"//th[@class='ddlabel'] | //table[not(.//*[contains(@*,'pldefault') or contains(@*,'ntdefault') or contains(@*,'bgtabon')])]"; 
    var nodes = doc.DocumentNode.SelectNodes(xpath); 

    foreach (var node in nodes) 
    { 
     table.Rows.Add(node.InnerHtml); 
    } 

    return table; 
} 
+1

' foreach' по-прежнему бросает 'NullRefenceException', если перечисление« null ». Он просто пропустит его, если перечисление пусто. Не совсем то же самое. – Kryptos

-2

Я думаю, что ваша проблема - это линия выше, когда вы получаете узлы. Просто объявите узел нулевым.

public DataTable tableIntoTable(HtmlDocument doc) 
{ 
    var table = new DataTable("MyTable"); 
    table.Columns.Add("raw", typeof(string)); 
    var xpath = @"//th[@class='ddlabel'] | //table[not(.//*contains(@*,'pldefault') or contains(@*,'ntdefault') or contains(@*,'bgtabon')])]"; 
    HtmlAgilityPack.HtmlNode? node = doc.DocumentNode.SelectNodes(xpath); 

    foreach (var node in nodes) 
    { 
     table.Rows.Add(node.InnerHtml); 
    } 
    return table; 
} 
+0

'SelectNodes' возвращает' HtmlNodeCollection', а не 'HtmlNode'. Это также класс, поэтому он не может быть нулевым. – reduckted

1

Если вы действительно любите null-coalescing operator свою красоту (как я), попробуйте это: [? Что такое NullReferenceException и как это исправить]

foreach (var node in nodes ?? Enumerable.Empty<HtmlNode>()) 
{ 
    // whatever 
} 
Смежные вопросы