C# 如何使用HtmlAgilityPack获取表单中的所有输入元素,而不获取空引用错误
HTML示例: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><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']");