XPath Using HtmlAgilityPack and WebClient

XPath, the XML Path Language, is a query language for selecting nodes from an XML document. The following code illustrates how to extract XPath using HtmlAgilityPack and a webclient on the fly.

You need to add a reference for HtmlAgilityPack; I've used version 1.4.0.1.

You can refer to http://htmlagilitypack.codeplex.com/releases/view/44954  to download the .dll

In this article we have used it to get multiple nodes using SelectNodesByPattern, which is an extension method.

We've used this url (http://htmlagilitypack.codeplex.com/releases/view/44954) as shown in the browser and found the value of "1.4.0 Stable".

HtmlAgilityPack1.jpg

We've tried to fetch a value of all heading "h1" tags having class ='page_title', kindly refer to the following:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
using System.Net;
using System.IO;

namespace DescendantUsingXPath
{
   public static class Program
    {
        static void Main(string[] args)
        {
            //WebClient object
            WebClient x = new WebClient();

            //Convert given url data to bytearray using DownloadData
            byte[] byteArray = x.DownloadData(new Uri("http://htmlagilitypack.codeplex.com/releases/view/44954"));

            //Convert Byte Array into Stram
            Stream stream = new MemoryStream(byteArray);

            //Create new object of HtmlAgilityPack.HtmlDocument
            HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

            //To load stream into html object

            htmlDoc.Load(stream);
 
           //To get the value of descendent of form ,I tried to get value of all h1 having class=page_title ,
             //it'd retrun all the combinations of heading h1 having class page_title
           
            HtmlNodeCollection inputNodes = htmlDoc.DocumentNode.SelectNodesByPattern(@"descendant::form;//h
[@class='page_title']"
);
            foreach (HtmlNode node in inputNodes)
            {
                string strValue = node.InnerText;
                Console.WriteLine(strValue);
                Console.ReadLine();
            }
        }

        /// <summary>
        /// Returns HtmlNodeCollection based on given pattern based XPath.
        /// Example: "//body;//form;//table[3];//input"
        /// </summary>
        /// <param name="node">HtmlAgilityPack.HtmlNode</param>
        /// <param name="pattern">String</param>
        /// <returns>HtmlNodeCollection</returns>
        public static HtmlNodeCollection SelectNodesByPattern(this HtmlNode node, string pattern)
        {
            if (node == null)
                return null;
            if (!pattern.Contains(";"))
                return null;

            string[] expressions = pattern.Trim().Split(new char[] { ';' });

            HtmlNode tempNode = node;
            int incr = 0;

            for (incr = 0; incr < expressions.Length - 1; incr++)
                if (tempNode != null)
                    tempNode = tempNode.SelectSingleNode(expressions[incr]);

            if (tempNode != null)
                return tempNode.SelectNodes(expressions[incr]);

            return null;
        }

    }

}

Output

HtmlAgilityPack2.jpg