GetElementsByTagName en Htmlagilitypack

c# getelementsbytagname html-agility-pack webbrowser-control

Pregunta

¿Cómo selecciono un elemento para, por ejemplo, un cuadro de texto si no conozco su ID?

Si conozco su id, entonces simplemente puedo escribir:

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

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

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

}

EDITAR

Aquí está el formulario HTML del que estoy hablando

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

Por favor, tenga en cuenta que no conozco la ID del formulario. Y puede haber varias formas en la misma página. Lo único que sé es "en algún momento" y quiero obtener este elemento usando solo este nombre. Así que supongo que tendré que analizar todas las formas una por una y luego encontrar este nombre "en algún momento", pero ¿cómo hago eso?

Respuesta aceptada

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

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

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

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

Para el último se puede crear un método de extensión simple:

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 usar SelectNodes y XPath para consultar su documento:

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

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

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

Te daría todas las entradas del primer formulario en la página.


Respuesta popular

Cualquier nodo por nombre:

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

Nodos de entrada por nombre:

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


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué