HTML Agility Pack supprimant les balises à fermeture automatique de l’entrée

Voici comment je crée ma case à cocher:

HtmlInputCheckBox checkbox = new HtmlInputCheckBox(); checkbox.ID = _Data.ControlID; checkbox.Atsortingbutes.Add("class", "checkbox"); checkbox.Atsortingbutes.Add("autocomplete", "off"); sReplacementSsortingng = element.RenderToSsortingng(); 

RenderToSsortingng est une extension qui fait ceci:

 public static ssortingng RenderToSsortingng(this Control control) { SsortingngBuilder sb = new SsortingngBuilder(); using (SsortingngWriter writer = new SsortingngWriter(sb)) { using (HtmlTextWriter htmlWriter = new HtmlTextWriter(writer)) { control.RenderControl(htmlWriter); } } return sb.ToSsortingng(); } 

Cela produit une chaîne avec une balise de fermeture sur l’entrée, ce que je peux voir lors du débogage.

  

Il est ensuite ajouté au code HTML à l’aide du pack Agility en tant que tel:

 HtmlNode temp = doc.CreateElement("temp"); temp.InnerHtml = sReplacementSsortingng; HtmlNode current = inputNode; foreach (HtmlNode child in temp.ChildNodes) { inputNode.ParentNode.InsertAfter(child, current); current = child; } inputNode.ParentNode.RemoveChild(inputNode); 

Toutefois, dans le code HTML, la balise de fermeture automatique manque pour la balise d’entrée de la case à cocher et échoue donc à la validation de WC3.

  

Cela se produit avec mes zones de texte qui sont générées de la même manière. il semble qu’ils se perdent lors de l’ajout du code HTML à la page à l’aide du pack d’agilité.

Comment puis-je empêcher cela?

Essayez de définir l’option “OptionWriteEmptyNodes”:

 HtmlDocument doc = new HtmlDocument(); doc.OptionWriteEmptyNodes = true; // .... 

METTRE À JOUR

Depuis que ma réponse initiale a été rejetée, voici une autre solution possible.

Passez-vous le DOCTYPE correct à votre document HTML avant de le rendre? Jetez un coup d’oeil à cette question SO pour savoir comment insérer un DOCTYPE: Ajouter un doctype au HTML via HTML Agility Pack

En fin de compte, cela me fait de la peine de dire que je me suis rabattu sur le traitement du code HTML avec regex pour append la balise à fermeture automatique. J’adorerais une meilleure solution, car il s’agit d’un hacky et non d’une preuve pour l’avenir. Elle doit être ajoutée à chaque balise à corriger:

 sXHTML = Regex.Replace(sXHTML, "", ""); 

Incluez ceci lorsque vous créez votre noeud de document et cela devrait résoudre votre problème:

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

Réponse originale: la balise d’image ne se ferme pas avec HTMLAgilityPack

Avez-vous essayé d’ignorer le nœud d’agiliy pack? Par exemple, cette ligne indiquera au pack d’agilité HTML d’ignorer la modification de ces nœuds.

  HtmlNode.ElementsFlags.Remove("meta");