Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HtmlAlityPack中的GetElementsByTagName_C#_Webbrowser Control_Html Agility Pack_Getelementsbytagname - Fatal编程技术网

C# HtmlAlityPack中的GetElementsByTagName

C# HtmlAlityPack中的GetElementsByTagName,c#,webbrowser-control,html-agility-pack,getelementsbytagname,C#,Webbrowser Control,Html Agility Pack,Getelementsbytagname,如果我不知道文本框的id,如何为其选择元素 如果我知道它的id,那么我可以简单地写: HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id); 但我不知道textbox的ID,在webbrowser控件中的HtmlagilityPack中找不到GetElementsByTagName方法。 在web浏览器控件中,我可以简单地编写: HtmlElementCollection elements = browser[i].Document.Ge

如果我不知道文本框的id,如何为其选择元素

如果我知道它的id,那么我可以简单地写:

HtmlAgilityPack.HtmlNode node = doc.GetElementbyId(id);
但我不知道textbox的ID,在webbrowser控件中的HtmlagilityPack中找不到GetElementsByTagName方法。 在web浏览器控件中,我可以简单地编写:

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>


请注意,我不知道表单的ID。同一页上可以有多个表单。我只知道“sometext”,我想用这个名字来获取这个元素。所以我想我必须一个接一个地解析所有表单,然后找到这个名称“sometext”,但我该怎么做呢?

我想你正在寻找类似的东西

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

如果要按标记名查找标记(如
窗体
),则可以使用:

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

如果您正在按标记的名称属性查找标记(例如
someForm
),则可以使用:

var forms = document.DocumentNode.Descendants("form");
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);
    }
}
将为您提供页面上表单标记中的所有输入

var nodes = doc.DocumentNode.SelectNodes("//form[1]//input");
将按名称为您提供页面上第一个表单的所有输入:

doc.DocumentNode.SelectNodes("//*[@name='name']")
按名称输入节点:

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

嗯,html是什么样子的?可能还有另一种方法。@SHAREK我已经编辑了我的问题,请看一看。看不需要n.Attributes检查和所有检查。有一个Name属性。您可以使用
。其中(n=>n.Name==TheNameYoureLookingFor)
@jessehouwing当我准备答案时,OP没有编辑问题,属性未知。@jessehouwing不,我不会想太多,因为只有几行html OP显示了。我只是展示了方法,不想写OP的完整代码。我宁愿给出完整简洁的答案,以避免回答10个新问题问题。@jessehouwing我不能说我对你如何回答这些问题很感兴趣。如果你有更好的话要说而不是写作为答案。这是我的方式。