GetElementsByTagName в Htmlagilitypack


Как выбрать элемент, например textbox, если я не знаю его id?

Если я знаю его идентификатор, то я могу просто написать:

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

Но я не знаю ID textbox и не могу найти метод GetElementsByTagName в HtmlagilityPack, который доступен в WebBrowser control. В управлении веб-браузером я мог бы просто написать:

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

}

EDIT

Вот HTML-форма, о которой я говорю

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

Пожалуйста, обратите внимание, что я не знаю идентификатор формы. И там может быть несколько форм на одной странице. Единственное, что я знаю, это "sometext", и я хочу получить этот элемент, используя только это имя. Поэтому я предполагаю, что мне придется разобрать все формы по одной, а затем найти это имя "sometext", но как это сделать?

3 9

3 ответа:

Если вы ищете тег по его tagName (например, form для <form name="someForm">), то вы можете использовать:

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

Если вы ищете тег по его свойству name (например, someForm для <form name="someForm">, то вы можете использовать:

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

Для последнего вы можете создать простой метод расширения:

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);
    }
}
Примечание: Вы также можете использовать SelectNodes и XPath для запроса вашего документа:
var nodes = doc.DocumentNode.SelectNodes("//form//input");

Даст вам все входные данные на странице, которые находятся в теге формы.

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

Отдал бы вам все входные данные первой формы на странице

Я думаю, что вы ищете что-то вроде этого

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

Любой узел по имени:

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

Входные узлы по имени:

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