c# - 有没有更好的方法来删除 span 元素但保留子节点?

标签 c# anglesharp

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

相关文章:

c# - 在 ContextMenu 中访问 ViewModel/DataContext

c# - AngleSharp 提取格式化文本

c# - 如何构建自定义 AngleSharp 元素并将 HTML 部分插入/转换到元素中

c# - 在显示到 WPF WebBrowser 控件之前操作 HTML 文档

c# 使用 AngleSharp 解析 HTML,找到带有部分 ID 的 DIV

c# - 使用 AngleSharp 解析 CSS

c# - AvalonDock DocumentContent 未被垃圾收集

c# - 可以转换为 float 然后再转换回小数的最小小数是多少?

c# - 从连接 Firebird 读取数据时出错

c# - 更新到 Unity 2019.3 后无法编译 Unity WebGL