HTML Agility Pack RemoveChild - non si comporta come previsto

c# html-agility-pack

Domanda

Dire che voglio rimuovere il tag span da questo html:

<html><span>we do like <b>bold</b> stuff</span></html>

Mi aspetto questo pezzo di codice per fare ciò che sto cercando

string html = "<html><span>we do like <b>bold</b> stuff</span></html>";
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

HtmlNode span = doc.DocumentNode.Descendants("span").First();
span.ParentNode.RemoveChild(span, true); //second parameter is 'keepGrandChildren'

Ma l'output è simile a questo:

<html> stuff<b>bold</b>we do like </html>

Sembra che stia invertendo i nodi figli all'interno dello span. Sto facendo qualcosa di sbagliato?

Risposta accettata

Sembra un bug in HtmlAgilityPack - guarda il loro registro di problemi:

http://htmlagilitypack.codeplex.com/workitem/9113

È interessante notare che questo è stato sollevato 4 anni fa ...

Ecco uno snippet che rimuoverà tutti i tag span (o qualsiasi altro tag specificato) e manterrà gli altri nodi nell'ordine corretto.

void Main()
{
    string html = "<html><span>we do like <b>bold</b> stuff</span></html>";
    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    RemoveTags(doc, "span");
    Console.WriteLine(doc.DocumentNode.OuterHtml);
}

public static void RemoveTags(HtmlDocument html, string tagName)
{
    var tags = html.DocumentNode.SelectNodes("//" + tagName);
    if (tags!=null)
    {
        foreach (var tag in tags)
        {
            if (!tag.HasChildNodes)
            {
                tag.ParentNode.RemoveChild(tag);
                continue;
            }

            for (var i = tag.ChildNodes.Count - 1; i >= 0; i--)
            {
                var child = tag.ChildNodes[i];
                tag.ParentNode.InsertAfter(child, tag);
            }
            tag.ParentNode.RemoveChild(tag);
        }
    }
}

Risposta popolare

foreach (HtmlNode child in tag.ChildNodes)
{
    tag.ParentNode.InsertBefore(child, tag);
}

tag.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é