Html Agility Pack - Eliminar elemento, pero no innerHtml

c# html html-agility-pack

Pregunta

Puedo eliminar fácilmente el elemento solo con una nota. Eliminar () me gusta esto:

HtmlDocument html = new HtmlDocument();

html.Load(Server.MapPath(@"~\Site\themes\default\index.cshtml"));

foreach (var item in html.DocumentNode.SelectNodes("//removeMe"))
{
    item.Remove();
}

Pero eso elimina el innerHtml también. ¿Qué pasa si solo quiero eliminar la etiqueta y mantener el innerHtml?

Ejemplo:

<ul>
    <removeMe>
        <li>
            <a href="#">Keep me</a>
        </li>
    </removeMe>
</ul>

Cualquier ayuda sería apreciada :)

Respuesta aceptada

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var node = doc.DocumentNode.SelectSingleNode("//removeme");
node.ParentNode.RemoveChild(node, true);

Respuesta popular

Hay un problema con la implementación de bool KeepGrandChildren para las personas que pueden tener texto dentro del elemento que intentan eliminar. Si la etiqueta removeme tenía texto, el texto también se eliminará. Por ejemplo, <removeme>text<p>more text</p></removeme> se convertirá en <p>more text</p>

Prueba esto:

private static void RemoveElementKeepText(HtmlNode node)
    {
        //node.ParentNode.RemoveChild(node, true);
        HtmlNode parent = node.ParentNode;
        HtmlNode prev = node.PreviousSibling;
        HtmlNode next = node.NextSibling;

        foreach (HtmlNode child in node.ChildNodes)
        {
            if (prev != null)
                parent.InsertAfter(child, prev);
            else if (next != null)
                parent.InsertBefore(child, next);
            else
                parent.AppendChild(child);

        }
        node.Remove();
    }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué