4

如果“SelectNodes”返回NULL,我如何在下面的 foreach 循环中捕获NullReferenceException错误?

我在 stackoverflow 上进行了搜索,发现提到了可用于捕获此错误的空合并条件(?? 条件),但是,我不知道 HTMLNode 的语法是什么,或者这是否可能。

foreach (HtmlNode link in imagegallery.DocumentNode.SelectNodes("//a[@href]") )
            {
                //Do Something
            }

你将如何为这个循环设置 NULL EXCEPTION,或者有更好的方法吗?

这是引发异常的完整代码 -

    private void TEST_button1_Click(object sender, EventArgs e)
    {
        //Declarations           
        HtmlWeb htmlWeb = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument imagegallery;

            imagegallery = htmlWeb.Load(@"http://adamscreation.blogspot.com/search?updated-max=2007-06-27T10:03:00-07:00&max-results=20&start=18&by-date=false");

            foreach (HtmlNode link in imagegallery.DocumentNode.SelectNodes("//a[@imageanchor=1 or contains(@href,'1600')]/@href"))
            {
               //do something
            }
    }       
4

3 回答 3

8
if(imagegallery != null && imagegallery.DocumentNode != null){
  foreach (HtmlNode link in 
    imagegallery.DocumentNode.SelectNodes("//a[@href]") 
      ?? Enumerable.Empty<HtmlNode>()) 
  {
    //do something
  }
}
于 2012-07-03T07:19:18.253 回答
0

您可以分两步完成,在使用之前测试集合是否为 NULL:

if (imagegallery != null && imagegallery.DocumentNode != null)
{
    HtmlNodeCollection linkColl = imagegallery.DocumentNode.SelectNodes("//a[@href]");

    if (linkColl != NULL)
    {
        foreach (HtmlNode link in linkColl)
        {
           //Do Something
        }
    }
}
于 2012-07-03T07:21:18.860 回答
0

我这样做了好几次,所以将 Andras 的解决方案变成了一种扩展方法:

using HtmlAgilityPack;

namespace MyExtensions {
    public static class HtmlNodeExtensions {
        /// <summary>
        ///     Selects a list of nodes matching the HtmlAgilityPack.HtmlNode.XPath expression.
        /// </summary>
        /// <param name="htmlNode">HtmlNode class to extend.</param>
        /// <param name="xpath">The XPath expression.</param>
        /// <returns>An <see cref="HtmlNodeCollection"/> containing a collection of nodes matching the <see cref="XPath"/> expression.</returns>
        public static HtmlNodeCollection SelectNodesSafe(this HtmlNode htmlNode, string xpath) {
            // Select nodes if they exist.
            HtmlNodeCollection nodes = htmlNode.SelectNodes(xpath);

            // I no matching nodes exist, return empty collection.
            if (nodes == null) {
                return new HtmlNodeCollection(HtmlNode.CreateNode(""));
            }

            // Otherwise, return matched nodes.
            return nodes;
        }
    }
}

用法:

using MyExtensions;

foreach (HtmlNode link in imagegallery.DocumentNode.SelectNodesSafe("//a[@href]")) {
    //Do Something
}
于 2013-07-14T12:14:31.473 回答