NullReferenceException ERROR dans une boucle foreach utilisant HTMLNode

c# foreach html-agility-pack nullreferenceexception

Question

Comment puis-je intercepter l'erreur NullReferenceException dans la boucle foreach ci-dessous si 'SelectNodes' renvoie NULL ?

J'ai cherché sur stackoverflow et trouvé mention de la condition null-coalescing (condition ??) qui peut être utilisée pour intercepter cette erreur, cependant, je n'ai aucune idée de ce que la syntaxe serait pour HTMLNode, ni même si c'est possible.

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

Comment feriez-vous la NULL EXCEPTION pour cette boucle ou existe-t-il un meilleur moyen de le faire?

Voici le code complet levant l'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
            }
    }       

Réponse acceptée

if(imagegallery != null && imagegallery.DocumentNode != null){
  foreach (HtmlNode link in 
    imagegallery.DocumentNode.SelectNodes("//a[@href]") 
      ?? Enumerable.Empty<HtmlNode>()) 
  {
    //do something
  }
}

Réponse populaire

Je faisais cela plusieurs fois alors j'ai transformé la solution d'Andras en une méthode d'extension:

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

Usage:

using MyExtensions;

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi