0

HMLDocumentの周りにフォームタグを追加するにはどうすればよいですか?

与えられた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;

</form>次のように返されます。終了タグの上に終了タグ</body>がないことに注意してください

<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>
4

1 に答える 1

2

FORM要素には特別な処理があります。詳細については、SOでここを参照してください:HtmlAgilityPack-<form>は何らかの理由でそれ自体を閉じますか?

だから、あなたはこれを行うことができます:

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の特別な処理を削除する必要はありません。

于 2013-03-26T07:10:08.730 に答える