HtmlagilitypackのGetElementsByTagName

c# getelementsbytagname html-agility-pack webbrowser-control

質問

どのように私はそのIDを知らない場合、テキストボックスの要素を選択するのですか?

もし私がそのIDを知っていれば、私は簡単に書くことができます:

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

しかし、私はテキストボックスのIDを知らないし、Webブラウザコントロールで利用可能なHtmlagilityPackでGetElementsByTagNameメソッドを見つけることができません。 Webブラウザのコントロールでは、私は単純に次のように書くことができました:

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>

私はフォームのIDを知らないことに注意してください。同じページに複数のフォームがある場合もあります。私が知っている唯一の事は "sometext"なので、私はこの名前を使ってこの要素を取得したいと思っています。だから、私はすべてのフォームを一つ一つパースしてから、この名前を "どこかに"見つけなければならないだろうが、どうやってそれをするのだろうか?

受け入れられた回答

あなたは(のようなそのtagNameをすることにより、タグを探しているならformのための<form name="someForm">次にあなたが使用することができます。

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

<form name="someForm">ようなsomeFormように、nameプロパティでタグを探している場合は、次のように使用できます。

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