Skip to content Skip to sidebar Skip to footer

Get A Value Of An Attribute By Xpath And Htmlagilitypack

I have a HTML document and I parse it with XPath. I want to get a value of the element input, but it didn't work. My Html:

Solution 1:

you can get it in .Attributes collection:

var doc = new HtmlAgilityPack.HtmlDocument();
doc.Load("file.html");
var node = doc.DocumentNode.SelectNodes("//input") [0];
var val = node.Attributes["value"].Value; //10743

Solution 2:

You can also directly grab the attribute if you use the HtmlNavigator.

//Load document from some html stringHtmlDocumenthdoc=newHtmlDocument();
hdoc.LoadHtml(htmlContent);

//load navigator for current documentHtmlNavigatornavigator= (HtmlNodeNavigator)hdoc.CreateNavigator();

//Get value with given xpathstringxpath="//input/@value";
stringval= navigator.SelectSingleNode(xpath).Value;

Solution 3:

Update2: Here is a code example how to get values of attributes using Html Agility Pack:

http://htmlagilitypack.codeplex.com/wikipage?title=Examples

HtmlDocumentdoc=newHtmlDocument();
 doc.Load("file.htm");
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
 {
    HtmlAttributeatt= link.Attributes["href"];
    att.Value = FixLink(att);
 }
 doc.Save("file.htm");

You obviously need to adapt this code to your needs -- for example you will not modify the attributes, but will just use att.Value .


Update: You may also look at this question:

Selecting attribute values with html Agility Pack


Your problem is most likely a default namespace problem -- search for "XPath default namespace c#" and you will find many good solutions (hint: use the overload of SelectNodes() that has an XmlNamespaceManager argument).

The following code shows what one gets for an attribute in a document in "no namespace":

using System;
using System.IO;
using System.Xml;

publicclassSample
{

    publicstaticvoidMain()
    {

        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<input value='novel' ISBN='1-861001-57-5'>" +
                    "<title>Pride And Prejudice</title>" +
                    "</input>");

        XmlNode root = doc.DocumentElement;

        XmlNode value = doc.SelectNodes("//input/@value")[0];

        Console.WriteLine("Inner text: " + value.InnerText);
        Console.WriteLine("InnerXml: " + value.InnerXml);
        Console.WriteLine("OuterXml: " + value.OuterXml);
        Console.WriteLine("Value: " + value.Value);

    }
}

The result from running this app is:

Inner text: novel
InnerXml: novel
OuterXml: value="novel"Value: novel

Now, for a document that is in a default namespace:

using System;
using System.IO;
using System.Xml;

publicclassSample
{

    publicstaticvoidMain()
    {

        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<input xmlns='some:Namespace' value='novel' ISBN='1-861001-57-5'>" +
                    "<title>Pride And Prejudice</title>" +
                    "</input>");

        XmlNode root = doc.DocumentElement;

        XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
        nsmgr.AddNamespace("x", "some:Namespace");

        XmlNode value = doc.SelectNodes("//x:input/@value", nsmgr)[0];

        Console.WriteLine("Inner text: " + value.InnerText);
        Console.WriteLine("InnerXml: " + value.InnerXml);
        Console.WriteLine("OuterXml: " + value.OuterXml);
        Console.WriteLine("Value: " + value.Value);

    }
}

Running this app produces again the wanted results:

Inner text: novel
InnerXml: novel
OuterXml: value="novel"Value: novel

Post a Comment for "Get A Value Of An Attribute By Xpath And Htmlagilitypack"