Comment remplacer les sauts de ligne par du code HTML valide, mais pas dans un élément HTML

c# html-agility-pack

Question

J'ai un texte simple qui contient des sauts de ligne comme ceci:

Dear Person,\r\nHello and welcome to this example.\r\nTodo: <ul><li>item 1</li>\r\n<li>item 2</li>\r\nThanks.

Je voudrais utiliser HtmlAgility Pack (si nécessaire) pour nettoyer le code HTML et remplacer les nouveaux sauts de ligne, par BR, sauf s'ils se trouvent déjà dans une balise HTML (voir LI dans la balise UL)

Je peux facilement remplacer le BR en utilisant regx ou text.Replace(Environment.NewLine, "<br/>") mais comment puis-je exclure le scénario où il se trouve dans une balise?

Merci.

Réponse populaire

Il semble que vous devez traiter uniquement les nœuds de texte HTML de niveau supérieur (les nœuds de texte ne possèdent pas de nœuds enfants):

var html = "Dear Person,\r\nHello and welcome to this example.\r\nTodo: <ul><li>item 1</li>\r\n<li>item 2</li>\r\nThanks.";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var textNodes = doc.DocumentNode.ChildNodes
    .OfType<HtmlTextNode>()
    .ToList();

foreach (var node in textNodes)
    node.Text = node.Text.Replace(Environment.NewLine, "<br />");

Cela produira quelque chose comme ceci:

var html = "Dear Person,\r\nHello and welcome to this example.\r\nTodo: <ul><li>item 1</li>\r\n<li>item 2</li>\r\nThanks.";
var doc = new HtmlDocument();
doc.LoadHtml(html);
var textNodes = doc.DocumentNode.ChildNodes
    .OfType<HtmlTextNode>()
    .ToList();

foreach (var node in textNodes)
    node.Text = node.Text.Replace(Environment.NewLine, "<br />");



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi