C# 如何使用HtmlAgilityPack获取表单中的所有输入元素,而不获取空引用错误

C# 如何使用HtmlAgilityPack获取表单中的所有输入元素,而不获取空引用错误,c#,html,parsing,html-agility-pack,C#,Html,Parsing,Html Agility Pack,HTML示例: <html><body> <form id="form1"> <input name="foo1" value="bar1" /> <!-- Other elements --> </form> <form id="form2"> <input name="foo2" value="bar2" />

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>
语句
doc.GetElementbyId(“form2”).SelectNodes(“.//input”)
为我提供了一个空引用


我做错了什么?谢谢。

您可以执行以下操作:

HtmlNode.ElementsFlags.Remove("form");

HtmlDocument doc = new HtmlDocument();

doc.Load(@"D:\test.html");

HtmlNode secondForm = doc.GetElementbyId("form2");

foreach (HtmlNode node in secondForm.Elements("input"))
{
    HtmlAttribute valueAttribute = node.Attributes["value"];

    if (valueAttribute != null)
    {
        Console.WriteLine(valueAttribute.Value);
    }
}
默认情况下,HTML Agility Pack将表单解析为空节点,因为允许表单与其他HTML元素重叠。第一行(
HtmlNode.ElementsFlags.Remove(“表单”);
)禁用此行为,允许您在第二个表单中获取输入元素

更新: 表单元素重叠的示例:

<table>
<form>
<!-- Other elements -->
</table>
</form>


元素从表内部开始,但在表元素外部关闭。这在HTML规范中是允许的,HTML Agility Pack必须处理它。

只需将它们放入数组中:

HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");

这是否意味着,除非您使用
HtmlNode.ElementsFlags.Remove(“表单”)
,不可能通过HAP解析
表单
元素的子元素?@Kevin,我不知道还有其他选择。5年后——仍然是一个要求,仍然是正确的答案。另外,仍然应该在包本身中更改…应该是secondForm.SelectNodes(“.//input”))而不是secondForm.Elements(“input”)),否则它不会得到嵌套的输入元素。
HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");