9

Wie wähle ich ein Element für z. Textfeld, wenn ich seine ID nicht kenne?GetElementsByTagName in Htmlagilitypack

Wenn ich weiß, seine ID dann kann ich einfach schreiben:

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

Aber ich weiß ID nicht Textbox ist und ich kann nicht GetElementsByTagName Methode in HtmlagilityPack finden, die in WebBrowser-Steuerelement zur Verfügung steht. In Web-Browser-Steuerung ich einfach geschrieben haben könnte:

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

} 

EDIT

Hier ist das HTML-Formular ich spreche

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

Bitte beachten Sie, ich die ID nicht kennen der Form. Und es kann mehrere Formulare auf derselben Seite geben. Das einzige, was ich weiß, ist "sometext" und ich möchte dieses Element nur mit diesem Namen erhalten. Ich denke, ich werde alle Formen einzeln analysieren müssen und dann diesen Namen als "etwas" finden, aber wie mache ich das?

+0

gut, was sieht das html aus? Es könnte einen anderen Weg geben. – shriek

+0

@shriek Ich habe meine Frage bearbeitet, bitte sehen Sie. – Ali

+0

Siehe http://stackoverflow.com/a/3120867/68607 – TFD

Antwort

26

Wenn Sie sich für den Tag durch seine tagName (wie form für <form name="someForm">) suchen, dann können Sie verwenden:

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

Wenn Sie nach dem Tag durch seine Namenseigenschaft suchen (wie someForm für <form name="someForm">, dann können Sie verwenden:

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

Für die letzte Sie eine einfache Erweiterung Methode schaffen könnte:

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

Hinweis:

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

Würde geben Sie alle an den Eingängen: Sie auch SelectNodes und XPath abfragen Dokument verwenden können die Seite, die in einem Formular-Tag sind.

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

Würden Sie alle Eingänge des ersten Formulars auf der Seite

5

Ich glaube, Sie suchen nach etwas, wie diese

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

Ich habe meine Frage bearbeitet, bitte sehen Sie. – Ali

+0

@Ali Ich habe die Antwort bereits aktualisiert –

+0

Keine Notwendigkeit für die n.Attributes Checks und alle. Es gibt eine Name-Eigenschaft. Sie können '.Where (n => n.Name == TheNameYoureLookingFor);' – jessehouwing

5

Jeden Knoten nach Namen:

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

Eingangsknoten nach Namen:

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