Как создать пустой XHTML-совместимый P-узел с помощью HTML Agility Pack 1.4.0? - PullRequest
0 голосов
/ 14 ноября 2010

Однако я пытаюсь создать HTMLNode для тега P и вставить его в DOM HTMLDocument, он всегда отображается как закрытый тег. Например.

// 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 = "";

Все они заканчиваются как <p> на выходе после использования метода .Save().

Я хочу, чтобы он был правильно закрыт для XHTML, как <p /> или <p></p>. Либо в порядке.

Мой обходной путь: Что я могу сделать, это выпустить CreateNode("<p> </p>") (с пробелом между ними), и он сохраняет весь источник, но я думаю, что должен быть лучший способ.

Другие опробованные или рассмотренные варианты:

  • Когда я включаю опцию .OutputAsXml, она экранирует существующие сущности, например, &nbsp; превращается в &amp;nbsp;, что не идеально, и не закрывает введенный мной тег P.

  • , когда я включаю опцию .OptionWriteEmptyNodes, она все равно не закрывает мой введенный тег P.

  • Я вижу, что Agility Pack содержит перечисление HtmlElementFlag со значениями Closed, Empty, CData, CanOverlap (Closed может быть полезно), но не может видеть, где я могу его применить при создании нового элемента / узла.

1 Ответ

1 голос
/ 14 ноября 2010

Я нашел ответ: тег P должен быть создан из экземпляра HtmlDocument, используя фабричный метод CreateElement(..), например:

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

Тогда P закроется как <p />.

Если вместо этого вы создадите экземпляр HtmlNode с помощью фабричного метода HtmlNode.CreateNode (..), как я пытался в этом вопросе, он будет вести себя по-разному в DOM вплоть до замыкания.

...