Cómo eliminar un nodo si no tiene un nodo padre

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

Pregunta

Estoy usando el paquete de agilidad HTML para limpiar la entrada a un WYSIWYG. Puede que esta no sea la mejor manera de hacerlo, pero estoy trabajando con desarrolladores que explotan en contacto con las expresiones regulares, por lo que será suficiente.

Mi contenido WYSIWYG se parece a esto (por ejemplo):

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

Necesito quitar las etiquetas de los párrafos vacíos. Así es como lo estoy haciendo en este 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);
}

Sin embargo, debido a que el HTML no es un documento completo, las etiquetas de párrafo no tienen un nodo primario y, por lo tanto, RemoveChild fallará ya que ParentNode es nulo.

Sin embargo, no puedo encontrar otra forma de eliminar la etiqueta. ¿Alguien puede indicarme un método alternativo?

Respuesta aceptada

Técnicamente, los elementos de primer nivel son hijos de la raíz del documento, por lo que el siguiente código debería funcionar:

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

Respuesta popular

¿Quieres eliminar de la colección, verdad?

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

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é