当我的搜索没有返回任何内容时,我使用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;
}
答案 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;
}