2010-11-14 57 views
0

Cependant, j'essaie de créer un HTMLNode pour la balise P et de l'injecter dans le DOM HTMLDocument, il apparaît toujours comme une balise non fermée. Par exemple.Comment créer un noeud P compatible XHTML vide en utilisant HTML Agility Pack 1.4.0?

// different ways I've tried creating the node: 
var p = HtmlNode.CreateNode("<p />"); 
var p = HtmlNode.CreateNode("<p></p>"); 
var p = HtmlNode.CreateNode("<p>"); 
var p = HtmlTextNode.CreateNode("<p></p>"); 

// some other properties I've played with: 
p.Name = "p"; 
p.InnerHtml = ""; 

Ils finissent tous comme juste <p> dans la sortie après avoir utilisé la méthode .Save(). Je veux le fermer correctement pour XHTML comme <p /> ou <p></p>. N'importe quel.

Ma solution: Ce que je peux faire est question CreateNode("<p> </p>") (avec un espace entre les deux) et il conserve la totalité de la source, mais je pense qu'il doit y avoir une meilleure façon.

Autres options essayés ou envisagés:

  • Quand je tourne sur l'option .OutputAsXml il échappe aux entités existantes, par exemple &nbsp; se tourne vers &amp;nbsp; qui n'est pas idéal, et il ne se ferme pas mon P injecté marque.

  • Lorsque j'active l'option .OptionWriteEmptyNodes, elle ne ferme toujours pas mon point P injecté.

  • Je vois que l'Agility Pack contient l'enum HtmlElementFlag avec les valeurs Closed, Empty, CData, CanOverlap (Fermé peut-être utile) mais je ne vois pas où je l'appliquerais lors de la création d'un nouvel élément/nœud.

Répondre

1

J'ai trouvé la réponse: la balise P doit être créé de l'instance HtmlDocument en utilisant la méthode de l'usine CreateElement(..) comme ceci:

var hdoc = new HtmlDocument(); // HTML doc instance 
// ... stuff 
HtmlNode p = hdoc.CreateElement("p"); // << will close itself for XHTML. 

Alors P se fermera comme <p />. Si vous créez plutôt une instance HtmlNode en utilisant la méthode d'usine HtmlNode.CreateNode (..) comme j'essayais dans la question, elle se comporte différemment dans le DOM jusqu'à la fermeture.