使用 C# 删除重复的 HTML 范围元素

本文关键字:HTML 范围 元素 删除 使用 | 更新日期: 2023-09-27 17:55:42

我必须将单词转换为html,我正在使用Aspose进行此操作,并且效果很好。 问题是它产生了一些多余的元素,我认为这是由于文本在单词中的存储方式。

例如,在我的Word文档中,出现以下文本:

发布授权

当转换为 html 时,它变成:

<span style="font-size:9pt">A</span>
<span style="font-size:9pt">UTHORIZATION FOR R</span>
<span style="font-size:9pt">ELEASE</span>

我正在使用 C#,并希望找到一种方法来删除多余的 span 元素。 我认为AngleSharp或html-agility-pack应该能够做到这一点,但我不确定这是最好的方法?

使用 C# 删除重复的 HTML 范围元素

我最终要做的是遍历所有元素,当检测到相邻的 span 元素时,我将文本连接在一起。如果其他人遇到此问题,下面是一些代码。 注意代码可能需要一些清理。

static void CombineRedundantSpans(IElement parent)
{
  if (parent != null)
  {               
    if (parent.Children.Length > 1)
    {
      var children = parent.Children.ToArray();
      var previousSibling = children[0];
      for (int i = 1; i < children.Length; i++)
      {
        var current = children[i];
        if (previousSibling is IHtmlSpanElement && current is IHtmlSpanElement)
        {
          if (IsSpanMatch((IHtmlSpanElement)previousSibling, (IHtmlSpanElement)current))
          {
              previousSibling.TextContent = previousSibling.TextContent + current.TextContent;
              current.Remove();
           }
           else
             previousSibling = current;
         }
         else
           previousSibling = current;
       }
     }
     foreach(var child in parent.Children)
     {
       CombineRedundantSpans(child);
     }
   }
}
static bool IsSpanMatch(IHtmlSpanElement first, IHtmlSpanElement second)
{
  if (first.ChildElementCount < 2 && first.Attributes.Length == second.Attributes.Length)
  {
    foreach (var a in first.Attributes)
    {
      if (second.Attributes.Count(t => t.Equals(a)) == 0)
      {
        return false;
      }
    }
    return true;
  }
  return false;
}