使用htmlagilitypack处理nullreferenceexception

时间:2015-05-20 19:05:57

标签: c# nullreferenceexception

当我的搜索没有返回任何内容时,我使用nullreferenceexception获得htmlagilitypack。我需要知道如何在代码中处理这个问题。我正在尝试使用??,但我并没有正确使用它,也不确定如何使用它。我真的只想知道如果nodes为空,如何运行某些方法。如果没有更好的方法,我可以用IF检查。

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;
    }

5 个答案:

答案 0 :(得分:1)

好吧,如果异常是由nodes为空引起的,那么如果它为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);

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

    return table;
}

答案 1 :(得分:1)

如果你真的喜欢null-coalescing operator的美丽(像我一样),试试这个:

foreach (var node in nodes ?? Enumerable.Empty<HtmlNode>())
{
    // whatever
}

答案 2 :(得分: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;
        }

答案 3 :(得分:-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;
}

答案 4 :(得分:-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;
}