GetElementsByTagName in Htmlagilitypack

c# getelementsbytagname html-agility-pack webbrowser-control

Domanda

Come seleziono un elemento per es. Textbox se non conosco il suo id?

Se conosco il suo id allora posso semplicemente scrivere:

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

Ma non conosco l'ID della textbox e non riesco a trovare il metodo GetElementsByTagName in HtmlagilityPack, disponibile nel controllo webbrowser. Nel controllo del browser web avrei potuto semplicemente scrivere:

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

}

MODIFICARE

Ecco il modulo HTML di cui sto parlando

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

Si prega di notare che non conosco l'ID del modulo. E ci possono essere diversi moduli sulla stessa pagina. L'unica cosa che so è "il sometto" e voglio ottenere questo elemento usando solo questo nome. Quindi immagino che dovrò analizzare tutti i moduli uno per uno e poi trovare questo nome "in qualche modo" ma come faccio?

Risposta accettata

Se stai cercando il tag con il suo tagName (come ad esempio form per <form name="someForm"> ), allora puoi usare:

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

Se stai cercando il tag con la sua proprietà name (come someForm per <form name="someForm"> , puoi usare:

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

Per l'ultimo è possibile creare un semplice metodo di estensione:

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: è possibile utilizzare SelectNodes e XPath per SelectNodes il documento:

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

Ti darei tutti gli input sulla pagina che sono in un tag form.

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

Ti darei tutti gli input del primo modulo sulla pagina


Risposta popolare

Qualsiasi nodo per nome:

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

Immettere i nodi per nome:

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


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché