如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误
Posted
技术标签:
【中文标题】如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误【英文标题】:How to get all input elements in a form with HtmlAgilityPack without getting a null reference error 【发布时间】:2011-01-24 01:23:12 【问题描述】:示例 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>
测试代码:
HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\test.html");
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input"))
Console.WriteLine(node.Attributes["value"].Value);
doc.GetElementbyId("form2").SelectNodes(".//input")
语句给了我一个空引用。
我做错了什么吗?谢谢。
【问题讨论】:
【参考方案1】:您可以执行以下操作:
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("form");
) 禁用此行为,允许您在第二个表单中获取输入元素。
更新: 表单元素重叠示例:
<table>
<form>
<!-- Other elements -->
</table>
</form>
元素在表格内部开始,但在表格元素外部结束。这在 HTML 规范中是允许的,HTML Agility Pack 必须处理它。
【讨论】:
这是否意味着,除非您使用HtmlNode.ElementsFlags.Remove("form");
,否则无法通过HAP 解析form
元素的子元素?
@Kevin,我不知道任何其他选择。
5 年后 - 仍然是一个要求,仍然是正确的答案。另外,仍然应该在包本身中进行更改...
应该是 secondForm.SelectNodes(".//input")) 而不是 secondForm.Elements("input")),否则得不到嵌套的输入元素。【参考方案2】:
只需将它们放入数组中即可:
HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");
【讨论】:
以上是关于如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误的主要内容,如果未能解决你的问题,请参考以下文章
获取两个标签之间的内部文本 - VB.NET - HtmlAgilityPack