【问题标题】:How to get all input elements in a form with HtmlAgilityPack without getting a null reference error如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误
【发布时间】: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") 语句给了我一个空引用。

我做错了什么吗?谢谢。

【问题讨论】:

    标签: c# html parsing html-agility-pack


    【解决方案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']");
    

    【讨论】:

      猜你喜欢
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2018-07-04
      相关资源
      最近更新 更多