Example HTML:
<html><body>
<form id="form1">
<input name="foo1" value="bar1" />
<!-- Other elements -->
</form>
<form id="form2">
<input name="foo2" value="bar2" />
<!-- Other elements -->
</form>
</body></html>
Test code:
HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\test.html");
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input"))
{
Console.WriteLine(node.Attributes["value"].Value);
}
The statement doc.GetElementbyId("form2").SelectNodes(".//input")
gives me a null reference.
Anything I did wrong? thanks.
You can do the following:
By default HTML Agility Pack parses forms as empty node because they are allowed to overlap other HTML elements. The first line, (
HtmlNode.ElementsFlags.Remove("form");
) disables this behavior allowing you to get the input elements inside the second form.Update: Example of form elements overlap:
The element begins inside a table but is closed outside the table element. This is allowed in the HTML specification and HTML Agility Pack has to deal with it.
Just get them in array: