24

示例 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")给了我一个空引用。

我做错什么了吗?谢谢。

4

2 回答 2

44

您可以执行以下操作:

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 必须处理它。

于 2010-03-05T15:53:06.917 回答
0

只需将它们放入数组中:

HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");
于 2018-09-25T17:32:24.180 回答