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



Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因