Есть ли лучший способ удалить элементы span, но оставить дочерние узлы? - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу удалить все элементы span (без атрибутов), но оставить внутренний html. Я создал следующий фрагмент кода, который, кажется, работает, но я не могу не думать, что это слишком сложно для такой задачи. Есть ли лучший способ?

var config = Configuration.Default.WithDefaultLoader().WithCss();
var parser = new HtmlParser(config);
var document = parser.Parse("<p><span><span><em>span text</em></span> </span> span text</p>");

foreach (var element in document.Descendents())
{
    var parent = element.Parent;
    while (parent != null)
    {
        var span = parent as IHtmlSpanElement;
        if (span != null && !span.Attributes.Any())
        {
            span.Replace(span.ChildNodes.ToArray());
        }
        parent = parent.Parent;
    }
}

document.Body.InnerHtml.Dump();

// outputs: <p><em>span text</em>  span text</p>

1 Ответ

0 голосов
/ 09 декабря 2018

То, что вы хотите, это замена. К счастью, такой API существует, который вы уже используете (Replace). Тем не менее, большая часть вашего стандартного кода также может быть заменена стандартными API (такими как QuerySelectorAll):

var config = Configuration.Default.WithDefaultLoader().WithCss();
var parser = new HtmlParser(config);
var document = parser.Parse("<p><span><span><em>span text</em></span> </span> span text</p>");

foreach (var element in document.QuerySelectorAll("span").Where(m => m.Attributes.Length == 0))
{
    element.Replace(element.ChildNodes.ToArray());
}

document.Body.InnerHtml.Dump();

Примечание. Я поместил Where только для того же условия, что и в коде, а именно: для этих элементов span атрибут не должен быть найден.

Надеюсь, это поможет!

...