如何使用HtmlAgilityPack获取表单中的所有输入元素而不会出现空引用错误

Bil*_* Li 23 html c# 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" />
       <!-- Other elements -->
     </form>   
 </body></html>
Run Code Online (Sandbox Code Playgroud)

测试代码:

HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\test.html");
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input"))
{
    Console.WriteLine(node.Attributes["value"].Value);            
}
Run Code Online (Sandbox Code Playgroud)

该声明doc.GetElementbyId("form2").SelectNodes(".//input")给了我一个空引用.

我做错了什么?谢谢.

Joã*_*elo 42

您可以执行以下操作:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下,HTML Agility Pack将表单解析为空节点,因为它们可以与其他HTML元素重叠.第一行(HtmlNode.ElementsFlags.Remove("form");)禁用此行为,允许您获取第二个表单内的输入元素.

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

<table>
<form>
<!-- Other elements -->
</table>
</form>
Run Code Online (Sandbox Code Playgroud)

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