HTML 敏捷包从输入中删除自关闭标记
本文关键字:删除 输入 HTML | 更新日期: 2023-09-27 18:31:26
这就是我创建复选框的方式:
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" />
然后使用敏捷包将其添加到 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 添加到页面时,它们似乎丢失了。
我该如何防止这种情况?
尝试设置"OptionWriteEmptyNodes"标志:
HtmlDocument doc = new HtmlDocument();
doc.OptionWriteEmptyNodes = true;
// ....
更新
由于我最初的答案被拒绝了,这是另一种可能的解决方案。
在呈现 HTML 文档之前,您是否将正确的 DOCTYPE 传递给它?看看这个SO问题,了解如何插入DOCTYPE:通过HTML敏捷包将文档类型添加到HTML
最后,
我很痛苦地说,我回到了使用正则表达式处理 HTML 以添加错误的自闭合标签。我想要一个更好的解决方案,因为这是黑客而不是未来的证明 - 必须为每个需要更正的标签添加它:
sXHTML = Regex.Replace(sXHTML, "<input(.*?)>", "<input $1 />");
在创建文档节点时包括以下内容,它应该可以解决您的问题:
if (HtmlNode.ElementsFlags.ContainsKey("input"))
{ HtmlNode.ElementsFlags["input"] = HtmlElementFlag.Closed;}
else
{ HtmlNode.ElementsFlags.Add("input", HtmlElementFlag.Closed);}
原答案:图像标记未使用 HTMLAgilityPack 关闭
您是否尝试忽略 agiliy pack 中的节点?例如,此行将告诉 html 敏捷包忽略更改此节点。
HtmlNode.ElementsFlags.Remove("meta");