HTML Agility Pack - 選擇帶有選項標籤的HTML選擇標記的問題

.net c# dom html-agility-pack

我正在使用HTML Agility Pack來選擇一個元素,並從加載的html字符串返回該元素及其包含的所有內容。在測試我的代碼時,我針對來自w3schools的select標籤示例運行它:

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

當我嘗試使用HTML敏捷包選擇並返回時,我得到(刪除選項結束標記):

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

所以我在這裡做了一些搜索並找到了添加該行的指令:HtmlNode.ElementsFlags.Remove(“option”);

我做到了,現在我得到了(選項文本被移動到選項標籤之外):

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

我希望輸出與原始HTML匹配。要做到這一點,我需要做什麼?

我也在使用OptionWriteEmptyNodes,因為當我使用輸入標籤進行測試時,他們的自我關閉被刪除了,添加該選項似乎解決了這個問題。我現在評論它以確保它不會影響這個問題。

這是我的.NET C#代碼:

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

一般承認的答案

您需要為選項標記設置ElementsFlag字段才能使其正常工作

HtmlNode.ElementsFlags["option"] = HtmlElementFlag.Closed;

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

應該返回原始的HTML代碼。

我認為HtmlAgilityPack以這種方式運行的原因是因為<option> -tag具有諷刺意味的是HTML中的可選標記,不需要結束標記。

摘自HtmlNode類的文檔及其字段ElementsFlags

獲取標誌的集合,這些標誌定義特定元素節點的特定行為。該表包含一個DictionaryEntry列表,其中小寫標記名稱為Key,HtmlElementFlags組合為Value。

進一步查看HtmlElementFlag枚舉顯示:

空 - 節點為空。 META或IMG是此類節點的示例。已關閉 - 解析期間將自動關閉節點。

您可以查看類HtmlNode的源代碼,以查看其他標記被視為“特定”。




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