我想删除所有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>

最佳答案

您想要的是替代品。幸运的是,您已经使用了这样的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元素上找不到属性。

希望这可以帮助!

关于c# - 有没有更好的方法来删除span元素但保留子节点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52315701/

10-11 12:17