Come eliminare un nodo se non ha un nodo genitore

.net asp.net c# html-agility-pack

Domanda

Uso il pacchetto agilità HTML per ripulire l'input in un WYSIWYG. Questo potrebbe non essere il modo migliore per farlo, ma sto lavorando con sviluppatori che esplodono al contatto con espressioni regolari, quindi dovrà essere sufficiente.

Il mio contenuto WYSIWYG è simile a questo (ad esempio):

<p></p>
<p></p>
<p><span><input id="textbox" type="text" /></span></p>

Devo rimuovere i tag di paragrafo vuoti. Ecco come lo sto facendo al momento:

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//p");
if (nodes == null)
    return;

foreach (HtmlNode node in nodes)
{
    node.InnerHtml = node.InnerHtml.Trim();
    if (node.InnerHtml == string.Empty)
        node.ParentNode.RemoveChild(node);
}

Tuttavia, poiché l'HTML non è un documento completo, i tag di paragrafo non hanno un nodo genitore e RemoveChild fallirà poiché ParentNode è nullo.

Non riesco a trovare un altro modo per rimuovere tag, qualcuno può indicarmi un metodo alternativo?

Risposta accettata

Tecnicamente, gli elementi di primo livello sono figli della radice del documento, quindi dovrebbe funzionare il seguente codice:

if (node.InnerHtml == String.Empty) {
    HtmlNode parent = node.ParentNode;
    if (parent == null) {
        parent = doc.DocumentNode;
    }
    parent.RemoveChild(node);
}

Risposta popolare

Vuoi rimuovere dalla raccolta, giusto?

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//p");
if (nodes == null)
    return;

for (int i = 0; i < nodes.Count - 1; i++)
{
    nodes[i].InnerHtml = nodes[i].InnerHtml.Trim();
    if (nodes[i].InnerHtml == string.Empty)
        nodes.Remove(i);
}


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é