So löschen Sie einen Knoten, wenn er keinen übergeordneten Knoten hat

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

Frage

Ich benutze das HTML-Agility-Paket, um Eingaben in einem WYSIWYG zu bereinigen. Dies ist vielleicht nicht der beste Weg, dies zu tun, aber ich arbeite mit Entwicklern, die bei Kontakt mit Regex explodieren, so dass es ausreichen muss.

Mein WYSIWYG-Inhalt sieht in etwa so aus:

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

Ich muss die leeren Absatztags entfernen. Hier ist, wie ich es gerade mache:

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

Da es sich bei dem HTML- RemoveChild jedoch nicht um ein vollständiges Dokument handelt, weisen die RemoveChild keinen übergeordneten Knoten auf und RemoveChild wird daher fehlschlagen, da ParentNode null hat.

Ich kann keinen anderen Weg finden, um Tags zu entfernen, kann mir jemand auf eine alternative Methode hinweisen?

Akzeptierte Antwort

Technisch gesehen handelt es sich bei Elementen der ersten Ebene um untergeordnete Elemente des Dokumentstamms. Daher sollte der folgende Code funktionieren:

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

Beliebte Antwort

Sie möchten aus der Sammlung entfernen, oder?

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



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum