Html Agility Pack: rimuovi l'elemento, ma non innerHtml

c# html html-agility-pack

Domanda

Posso facilmente rimuovere l'elemento solo con nota.Rimuovi () questo lik:

HtmlDocument html = new HtmlDocument();

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

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

Ma ciò rimuove anche innerHtml. Cosa succede se voglio solo rimuovere il tag e mantenere innerHtml?

Esempio:

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

Qualsiasi aiuto sarebbe apprezzato :)

Risposta accettata

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

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

Risposta popolare

C'è un problema con l'implementazione booster KeepGrandChildren per le persone che potrebbero avere testo con l'elemento che stanno cercando di rimuovere. Se il tag removeme contiene del testo, anche il testo verrà rimosso. Ad esempio <removeme>text<p>more text</p></removeme> diventerà <p>more text</p>

Prova questo:

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();
    }


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché