9

¿Cómo selecciono un elemento para, p. Ej. cuadro de texto si no sé su id?GetElementsByTagName en Htmlagilitypack

Si conozco su identificador entonces yo puedo escribir simplemente:

HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id); 

Pero no sé Identificación del cuadro de texto y no puedo encontrar el método GetElementsByTagName en HtmlagilityPack que está disponible en el control WebBrowser. En control de explorador web que podría haber escrito simplemente:

HtmlElementCollection elements = browser[i].Document.GetElementsByTagName("form"); 
foreach (HtmlElement currentElement in elements) 
{ 

} 

EDITAR

Aquí está el formulario HTML que estoy hablando

<form id="searchform" method="get" action="/test.php"> 
<input name="sometext" type="text"> 
</form> 

Tenga en cuenta que no sé el ID de forma. Y puede haber varios formularios en la misma página. Lo único que sé es "algún texto" y quiero obtener este elemento usando solo este nombre. Así que supongo que tendré que analizar todos los formularios uno por uno y luego encontrar el nombre "algún texto", pero ¿cómo puedo hacer eso?

+0

así, lo Cómo se ve el html? podría haber otra manera. – shriek

+0

@shriek He editado mi pregunta, por favor eche un vistazo. – Ali

+0

Ver http://stackoverflow.com/a/3120867/68607 – TFD

Respuesta

26

Si usted está buscando la etiqueta por su tagName (como form para <form name="someForm">), entonces usted puede utilizar:

var forms = document.DocumentNode.Descendants("form"); 

Si está buscando la etiqueta por su propiedad de nombre (como someForm para <form name="someForm">, puede usar:

var forms = document.DocumentNode.Descendants().Where(node => node.Name == "formName"); 

Para el último que podría crear un simple método de extensión:

public static class HtmlNodeExtensions 
{ 
    public static IEnumerable<HtmlNode> GetElementsByName(this HtmlNode parent, string name) 
    { 
     return parent.Descendants().Where(node => node.Name == name); 
    } 

    public static IEnumerable<HtmlNode> GetElementsByTagName(this HtmlNode parent, string name) 
    { 
     return parent.Descendants(name); 
    } 
} 

Nota: También puede utilizar SelectNodes y XPath para consultar el documento:

var nodes = doc.DocumentNode.SelectNodes("//form//input"); 

le daría todas las entradas de la página que está en una etiqueta de formulario.

var nodes = doc.DocumentNode.SelectNodes("//form[1]//input"); 

¿Le dará todas las entradas de la primera formulario en la página

5

creo que busca algo como esto

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
doc.LoadHtml("...."); 

var inputs = doc.DocumentNode.Descendants("input") 
    .Where(n => n.Attributes["name"]!=null && n.Attributes["name"].Value == "sometext") 
    .ToArray(); 
+0

He editado mi pregunta, eche un vistazo. – Ali

+0

@Ali Actualicé la respuesta ya –

+0

No hay necesidad de los controles n.Attributes y todo. Hay una propiedad de Nombre. Puedes usar '.Where (n => n.Name == TheNameYoureLookingFor);' – jessehouwing

5

Cualquier nodo por su nombre:

doc.DocumentNode.SelectNodes("//*[@name='name']") 

nodos de entrada por su nombre:

doc.DocumentNode.SelectNodes("//input[@name='name']") 
Cuestiones relacionadas