Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HTML敏捷包从输入中剥离自动关闭标记_C#_Asp.net_.net_Html Agility Pack - Fatal编程技术网

C# HTML敏捷包从输入中剥离自动关闭标记

C# HTML敏捷包从输入中剥离自动关闭标记,c#,asp.net,.net,html-agility-pack,C#,Asp.net,.net,Html Agility Pack,以下是我创建复选框的方式: HtmlInputCheckBox checkbox = new HtmlInputCheckBox(); checkbox.ID = _Data.ControlID; checkbox.Attributes.Add("class", "checkbox"); checkbox.Attributes.Add("autocomplete", "off"); sReplacementString = element.RenderToString(); RenderToS

以下是我创建复选框的方式:

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中,复选框的输入标记缺少其自动关闭斜杠,因此无法通过WC3验证

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

我的文本框也是这样生成的。在使用agility pack将HTML添加到页面时,他们似乎迷失了方向

如何防止这种情况发生?

尝试设置“OptionWriteEmptyNodes”标志:

更新

由于我最初的回答被拒绝,这里有另一个可能的解决方案


在呈现HTML文档之前,是否将正确的DOCTYPE传递给它?看看这个关于如何插入DOCTYPE的问题:

最后,我痛苦地说,我放弃了用正则表达式处理HTML以添加错误的自动关闭标记。我希望有一个更好的解决方案,因为这是黑客的,而不是未来的证明-它必须添加到每个需要更正的标签中:

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

在创建文档节点时应包括以下内容,这样可以解决您的问题:

if (HtmlNode.ElementsFlags.ContainsKey("input"))
{   HtmlNode.ElementsFlags["input"] = HtmlElementFlag.Closed;}
else
{   HtmlNode.ElementsFlags.Add("input", HtmlElementFlag.Closed);}
原始答复:

是否尝试忽略agiliy pack中的节点? 例如,此行将告诉html agility pack忽略更改此节点

  HtmlNode.ElementsFlags.Remove("meta");

哪个W3C验证失败?您是否期望XHTML输出?HTML支持自动关闭标记吗?我们的要求是对XHTML 1.1进行验证-我们得到以下错误:
省略了“input”的结束标记,但指定了ommittag NO-您可能忽略了关闭元素,或者您的意思是“自动关闭”元素,即以“/>”而不是“>”结束它您使用的是WriteTo(TextWriter)还是WriteTo(XmlWriter)?设置doc.OptionOutputAsXml了吗?设置
doc.OptionOutputAsXml
仍然会给我非闭合输入标记。我没有使用
WriteTo(TextWriter)
WriteTo(XmlWriter)
。你为什么不使用
WriteTo(XmlWriter)
?OptionOutput属性确定
WriteTo
方法的功能,以及如何检索html?像
OuterHtml
这样的属性返回的html不是有效的xhtml。是的,doctype是正确的。我们不会通过敏捷包添加它。Agility Pack仅用于操作HTML的一部分。谢谢,doc.OptionWriteEmptyNodes=true;对我也有用。img标签现在是用/>而不是用>关闭的,这似乎是正确的答案-我遇到了完全相同的问题,现在它正在按预期工作。选择的答案只是一个小技巧。不知道为什么它不适用于op。有没有一种方法可以将答案标记为“社区选择”,这样我们就可以将其浮出水面,而不是将其放在列表的底部?
if (HtmlNode.ElementsFlags.ContainsKey("input"))
{   HtmlNode.ElementsFlags["input"] = HtmlElementFlag.Closed;}
else
{   HtmlNode.ElementsFlags.Add("input", HtmlElementFlag.Closed);}
  HtmlNode.ElementsFlags.Remove("meta");