HTML Agility Pack從輸入中剝離自閉標籤

.net asp.net c# html-agility-pack

這就是我創建複選框的方式:

HtmlInputCheckBox checkbox = new HtmlInputCheckBox();
checkbox.ID = _Data.ControlID;
checkbox.Attributes.Add("class", "checkbox");
checkbox.Attributes.Add("autocomplete", "off");
sReplacementString = element.RenderToString();

RenderToString是一個擴展,它執行此操作:

public static string RenderToString(this Control control)
{
    StringBuilder sb = new StringBuilder();
    using (StringWriter writer = new StringWriter(sb))
    {
        using (HtmlTextWriter htmlWriter = new HtmlTextWriter(writer))
        {
            control.RenderControl(htmlWriter);
        }
    }
    return sb.ToString();
}

這會在輸入上生成一個帶有結束標記的字符串,我可以在調試時看到這一點。

<input name="ttWBF_1" type="checkbox" id="ttWBF_1" autocomplete="off" class="checkbox" />

然後使用Agility Pack將其添加到HTML中:

HtmlNode temp = doc.CreateElement("temp");
temp.InnerHtml = sReplacementString;
HtmlNode current = inputNode;

foreach (HtmlNode child in temp.ChildNodes)
{
    inputNode.ParentNode.InsertAfter(child, current);
    current = child;
}
inputNode.ParentNode.RemoveChild(inputNode);

但是在HTML中,複選框的輸入標記缺少其自動關閉斜杠,因此無法通過WC3驗證。

<input name="ttWBF_1" type="checkbox" id="ttWBF_1" autocomplete="off" class="checkbox">

這種情況發生在我的文本框中,它們以相同的方式生成。使用敏捷包將HTML添加到頁面時,看起來好像迷路了。

我該如何防止這種情況?

一般承認的答案

最後,我很難說我回過頭來用正則表達式處理HTML以添加微不足道的自動關閉標籤。我想要一個更好的解決方案,因為這是hacky而不是未來的證據 - 必須為每個需要糾正的標籤添加它:

sXHTML = Regex.Replace(sXHTML, "<input(.*?)>", "<input $1 />");

熱門答案

嘗試設置“OptionWriteEmptyNodes”標誌:

HtmlDocument doc = new HtmlDocument();
doc.OptionWriteEmptyNodes = true;

// ....

UPDATE

由於我的原始答案被拒絕,這是另一種可能的解決方案。

在呈現之前,您是否將正確的DOCTYPE傳遞給HTML文檔?看看這個SO問題,了解如何插入DOCTYPE: 通過HTML Agility包將文檔類型添加到HTML




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