有没有更好的方法来删除跨度元素但保留子节点?



我想删除所有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元素上找到任何属性。

希望这有帮助!

相关内容

最新更新