Как удалить узел, если у него нет родительского узла

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

Вопрос

Я использую пакет гибкости HTML для очистки ввода WYSIWYG. Это может быть не лучший способ сделать это, но я работаю с разработчиками, которые взрываются при контакте с регулярным выражением, поэтому этого будет достаточно.

Мой контент WYSIWYG выглядит примерно так (например):

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

Мне нужно разбить пустые теги абзаца. Вот как я это делаю сейчас:

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

Однако, поскольку HTML не является полным документом, теги абзаца не имеют родительского узла, поэтому RemoveChild будет терпеть неудачу, поскольку ParentNode имеет значение NULL.

Я не могу найти другой способ удалить тег, может ли кто-нибудь указать мне на альтернативный метод?

Принятый ответ

Технически элементы первого уровня являются дочерними элементами корневого документа, поэтому следующий код должен работать:

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

Популярные ответы

Вы хотите удалить из коллекции, не так ли?

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

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему