GetElementsByTagName в Htmlagilitypack

c# getelementsbytagname html-agility-pack webbrowser-control

Вопрос

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

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

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

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

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

}

РЕДАКТИРОВАТЬ

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

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

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

Принятый ответ

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

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

Если вы ищете тег по свойству имени (например, 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");

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


Популярные ответы

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

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

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

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow