GetElementsByTagName dans Htmlagilitypack

c# getelementsbytagname html-agility-pack webbrowser-control

Question

Comment sélectionner un élément pour, par exemple, une zone de texte si je ne connais pas son identifiant?

Si je connais son identifiant, je peux simplement écrire:

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

Mais je ne connais pas l'ID de textbox et je ne trouve pas la méthode GetElementsByTagName dans HtmlagilityPack, disponible dans le contrôle WebBrowser. Dans le contrôle du navigateur Web, j'aurais pu simplement écrire:

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

}

MODIFIER

Voici le formulaire HTML dont je parle

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

Veuillez noter que je ne connais pas l'identifiant du formulaire. Et il peut y avoir plusieurs formulaires sur la même page. La seule chose que je sache est "sometext" et je veux obtenir cet élément en utilisant simplement ce nom. Je suppose donc que je devrai analyser tous les formulaires un par un, puis trouver le nom "sometext", mais comment puis-je le faire?

Réponse acceptée

Si vous recherchez la balise par son nom de balise (tel que form pour <form name="someForm"> ), vous pouvez utiliser:

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

Si vous recherchez la balise en fonction de sa propriété name (telle que someForm pour <form name="someForm"> , vous pouvez utiliser:

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

Pour le dernier, vous pouvez créer une méthode d'extension 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);
    }
}

Remarque: vous pouvez également utiliser SelectNodes et XPath pour interroger votre document:

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

Vous donnerait toutes les entrées sur la page qui sont dans une balise de formulaire.

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

Vous donnerait toutes les entrées du premier formulaire sur la page


Réponse populaire

Tout noeud par nom:

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

Noeuds d'entrée par nom:

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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi