using System.Collections.Generic;
public static class Program
public static void Main()
var html = "<p class=\"test\"><span class=\"text\">Hola, soy Carlos. </br> Encantado <a href=\"#popup\">de ayudarte</a>.</span></p></br>";
string x = html.RemoveHtmlTags();
public static string RemoveHtmlTags(this string html)
if (string.IsNullOrEmpty(html))
var doc = new HtmlAgilityPack.HtmlDocument();
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
return WebUtility.HtmlDecode(html);
List<string> splitText = new();
foreach (var node in doc.DocumentNode.ChildNodes)
List<string> nodeElements = SplitNodeElements(node);
splitText.AddRange(nodeElements);
string result = string.Join("", splitText.ToArray());
return WebUtility.HtmlDecode(result);
public static string GetOpeningTag(HtmlNode node, HtmlNode root)
return root.OuterHtml[node.OuterStartIndex..node.InnerStartIndex];
public static string GetClosingTag(HtmlNode node, HtmlNode root)
return root.OuterHtml[(node.InnerStartIndex + node.InnerLength)..(node.OuterStartIndex + node.OuterLength)];
public static List<string> SplitNodeElements(HtmlNode node, HtmlNode? root = null)
List<string> splitNode = new();
if (node.NodeType == HtmlNodeType.Text)
splitNode.Add(node.InnerText);
if (node.NodeType == HtmlNodeType.Element && !node.HasChildNodes)
splitNode.Add(node.OuterHtml);
if (node.NodeType == HtmlNodeType.Element && node.HasChildNodes)
splitNode.Add(GetOpeningTag(node, root ?? node));
foreach (var child in node.ChildNodes)
splitNode.AddRange(SplitNodeElements(child, root ?? node));
splitNode.Add(GetClosingTag(node, root ?? node));