使用HtmlAgilityPack折叠不必要的嵌套跨度

时间:2018-06-13 22:01:42

标签: c# html-agility-pack

我正在努力规范化一些外部检索的HTML,这些HTML在富文本编辑器中的另一个站点上输入。该网站不是由我们管理的,我们无法纠正这方面的问题。可以想象,我们获得的HTML质量不一致。使用HtmlAgilityPack,我能够做得更好。我做的事情就是更换标签,删除空标签等等。

我遇到的其中一个质量问题是,有时我会收到这样的HTML,其中包含大量嵌套的span s(实际代码段):

<h2><span><span><span><span><span><span><span><span><span>
<span><span><span><span><span><span><span><span><span><span>
<span><span><span><span><span><span><span><span><span><span>
<span><span><span><span><b><span><span><span><u><span>Working with us</span> 
</u></span></span></span></b></span></span></span></span></span></span> 
</span></span></span></span></span></span></span></span></span></span></span> 
</span></span></span></span></span></span></span></span></span></span></span> 
</span></span></span></span></span></h2>

我希望折叠所有跨度以产生以下结果:

<h2><span><b><span><u><span>Working with us</span></u></span></b></span></h2>

我可以使用一些额外的元素,但我想让span崩溃。

我的代码似乎正常运行:

public static void CollapseElements(HtmlNode root, string tagName)
{
    // This query finds all nodes which are children of the same type of node which
    // are the only child of the parent node
    var query = $"//{tagName}/{tagName}[count(preceding-sibling::*)+count(following-sibling::*)=0]";

    var nodes = root.SelectNodes(query);

    while (nodes != null && nodes.Count == 0)
    {
        foreach (var node in nodes)
        {
            var newNode = HtmlNode.CreateNode($"<{tagName}>{node.InnerHtml}</{tagName}>");
            node.ParentNode.ParentNode.ReplaceChild(newNode, node.ParentNode);
        }

        nodes = root.SelectNodes(query);
    }
}

有没有人看到这种方法存在任何缺陷,或者有其他建议?

0 个答案:

没有答案