2011-12-29 40 views
8

Tengo un documento HTML y lo analizo con XPath. Quiero obtener un valor de la entrada del elemento, pero no funcionó.Obtener un valor de un atributo por XPath y HtmlAgilityPack

Mi HTML:

<tbody> 
    <tr> 
    <td> 
     <input type="text" name="item" value="10743" readonly="readonly" size="10"/> 
    </td> 
    </tr> 
</tbody> 

Mi código:

using HtmlAgilityPack; 

HtmlAgilityPack.HtmlDocument doc; 
HtmlWeb hw = new HtmlWeb(); 
HtmlNodeCollection node = doc.DocumentNode.SelectNodes("//input/@value"); 
string s=node[0].InnerText; 

Así Quiero obtener el valor: "10743" (y no me importa para conseguir otro etiquetas con el respuesta.)

+0

¿Usted intentó 'nodo [0] .Value'? – Oded

+0

No, porque quiero obtener el valor por 'node [0] .InnerText' –

+1

Pero un atributo no tiene' InnerText'. – Oded

Respuesta

6

Update2: Aquí hay un ejemplo de código de cómo obtener los valores de los atributos usando Html Agility Pack:

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

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

Obviamente, se necesita adaptar este código a sus necesidades - por ejemplo, no va a modificar los atributos, pero va a utilizar solo att.Value.


actualización: Usted también puede mirar a esta pregunta:

Selecting attribute values with html Agility Pack


Su problema es más probable un problema de espacio de nombres predeterminado - buscar "XPath espacio de nombres predeterminado C# "y encontrará muchas buenas soluciones (sugerencia: use la sobrecarga de SelectNodes() que tiene un argumento XmlNamespaceManager).

El código siguiente muestra lo que se obtiene para un atributo en un documento en "ningún espacio de nombres":

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

public class Sample 
{ 

    public static void Main() 
    { 

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

    } 
} 

El resultado de ejecutar esta aplicación es:

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

Ahora, para un documento que está en un espacio de nombre predeterminado:

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

public class Sample 
{ 

    public static void Main() 
    { 

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

    } 
} 

La ejecución de esta aplicación produce de nuevo los resultados deseados:

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

Gracias, pero no es el problema, mi documento es Html, y otra XPath doe es buena, excepto por eso, porque este XPath no es el adecuado para mi intención. Necesito encontrar otro XPath, pero no tengo idea. –

+0

¿No estaba claro? de todos modos, agregué ** todo ** mi código y escribí lo que quería: la cadena: "** 10743 **" (valor de la entrada del nodo) –

+0

@Chanipoz: eche un vistazo a mi segunda actualización: un ejemplo de código que muestra exactamente cómo obtener el valor de un atributo usando Html Agility Pack, algo que puedes adaptar fácilmente a tus necesidades. –

14

lo puede conseguir en .Attributes colección:

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

También puede tomar directamente el atributo si se utiliza el HtmlNavigator .

//Load document from some html string 
HtmlDocument hdoc = new HtmlDocument(); 
hdoc.LoadHtml(htmlContent); 

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

//Get value with given xpath 
string xpath = "//input/@value"; 
string val = navigator.SelectSingleNode(xpath).Value; 
Cuestiones relacionadas