HtmlAgilityPack刪除選項結束標記

html html-agility-pack parsing

我正在使用HtmlAgilityPack。我用以下字符串創建一個HtmlDocument和LoadHtml:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

這有些意想不到的事情。首先,它給出了兩個解析器錯誤,EndTagNotRequired。其次,select節點有4個子節點 - 兩個用於選項標籤,另外兩個用於選項標籤的內部文本。最後,OuterHtml是這樣的:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

所以基本上我決定在選項上刪除結束標記。讓我們暫時擱置一下,這樣做是否合適和可取。我正在使用HtmlAgilityPack來測試HTML生成代碼,所以我不希望它為我做出任何決定或者給出任何錯誤,除非HTML確實是錯誤的。有沒有辦法使它表現我想要的?我嘗試為HtmlDocument設置一些選項,具體來說:

<select id="foo_Bar" name="foo.Bar"><option selected="selected" value="1">One</option><option value="2">Two</option></select>

這不起作用。如果HtmlAgilityPack不能做我想要的,你能推荐一些可以嗎?

一般承認的答案

在HAP主頁的討論中報告了完全相同的錯誤,但看起來幾年內沒有對該項目進行任何有意義的修復。不鼓勵。

快速瀏覽源代碼表明錯誤可能通過註釋HtmlNode.cs的第92行來修復:

// they sometimes contain, and sometimes they don 't...
ElementsFlags.Add("option", HtmlElementFlag.Empty);

(實際上不是,它們總是包含標籤文本,儘管空白字符串也是有效文本。粗心的作者可能會省略結束標記,但那時任何元素都是如此。)

一個等效的解決方案是調用HtmlNode.ElementsFlags.Remove("option");在任何使用liberary之前(不需要修改liberary源代碼)


熱門答案

似乎有一些理由不將Option標籤解析為“通用”標籤,對於XHTML合規性,然而這可能是一個真正的痛苦。

我的建議是做一個完整的字符串替換並將所有“選項”標籤更改為“my_option”標籤,這樣你:

  1. 不必修改庫的源代碼(以後可以升級)。
  2. 可以像往常一樣解析。

HtmlAgilityPack論壇上的原始帖子可以在以下網址找到: http ://htmlagilitypack.codeplex.com/Thread/View.aspx?ThreadId=14982




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