如何使用HtmlAgilityPack獲取表單中的所有輸入元素而不會出現空引用錯誤

c# html html-agility-pack parsing

示例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>

測試代碼:

 <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("form"); )禁用此行為,允許您獲取第二個表單內的輸入元素。

更新:表單元素重疊的示例:

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規範中是允許的,HTML Agility Pack必須處理它。


熱門答案

只需將它們放入數組中:

HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因