使用htmllagilitypack在body标签周围添加表单标签

本文关键字:标签 周围 表单 添加 body htmllagilitypack 使用 | 更新日期: 2023-09-27 18:05:35

如何在html文档周围添加表单标签?

对于给定的HTML

<html>
 <head>
  <title></title>
 </head>
 <body>
  <p>Full name: <input name="FullName" type="text" value=""></p> 
  <p><input name="btnSubmit" type="submit" value="Submit"></p>
 </body>
</html>

和下面的代码…

var doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = true;
doc.LoadHtml(input);
var body = doc.DocumentNode.SelectSingleNode("//body");
if (doc.DocumentNode.SelectNodes("//form[@action]") == null)
{
    var form = doc.CreateElement("form");
    form.Attributes.Add("action", "/pages/event/10302");
    body.PrependChild(form);
}
return doc.DocumentNode.OuterHtml;

我得到了下面的结果,注意在

结束的</body>标签上面没有结束的</form>标签
<html>
 <head>
  <title></title>
 </head>
 <body>
  <form action="/pages/event/10302">
  <p>Full name: <input name="FullName" type="text" value=""></p> 
  <p><input name="btnSubmit" type="submit" value="Submit"></p>
 </body>
</html>

使用htmllagilitypack在body标签周围添加表单标签

FORM元素有一个特殊的处理。点击这里了解更多:htmllagilitypack——Does

出于某种原因关闭了自己?

你可以这样写:

var doc = new HtmlDocument();
HtmlNode.ElementsFlags.Remove("form"); // remove special handling for FORM
doc.LoadHtml(input);
var body = doc.DocumentNode.SelectSingleNode("//body");
if (doc.DocumentNode.SelectNodes("//form[@action]") == null)
{
    var form = doc.CreateElement("form");
    form.Attributes.Add("action", "/pages/event/10302");
    body.PrependChild(form);
}

但是它会给你这个:

<html>
 <head>
  <title></title>
 </head>
 <body>
  <form action="/pages/event/10302"></form>
  <p>Full name: <input name="FullName" type="text" value=""></p> 
  <p><input name="btnSubmit" type="submit" value="Submit"></p>
 </body>
</html>

这是合乎逻辑的,你没有在新形式中包围任何东西。所以,你可以这样做:

var doc = new HtmlDocument();
doc.LoadHtml(input);
var body = doc.DocumentNode.SelectSingleNode("//body");
if (doc.DocumentNode.SelectNodes("//form[@action]") == null)
{
    var form = body.CloneNode("form", true);
    form.Attributes.Add("action", "/pages/event/10302");
    body.ChildNodes.Clear();
    body.PrependChild(form);
}

将得到这个:

<html>
 <head>
  <title></title>
 </head>
 <body><form action="/pages/event/10302">
  <p>Full name: <input name="FullName" type="text" value=""></p>
  <p><input name="btnSubmit" type="submit" value="Submit"></p>
 </form></body>
</html>

这不是唯一的方法,但它是有效的,并且您不一定要删除FORM的特殊处理