使用 C# 删除重复的 html 跨度元素
using c# remove duplicate html span elements
我必须将 word 转换为 html,这是我在 Aspose 中所做的,而且效果很好。问题是它产生了一些冗余元素,我认为这是由于文本在 word 中的存储方式所致。
例如在我的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# 并且想要一种删除冗余跨度元素的方法。我在想 AngleSharp 或 html-agility-pack 应该能够做到这一点,但我不确定这是最好的方法吗?
我最后做的是遍历所有元素,当检测到相邻的 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;
}
我必须将 word 转换为 html,这是我在 Aspose 中所做的,而且效果很好。问题是它产生了一些冗余元素,我认为这是由于文本在 word 中的存储方式所致。
例如在我的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# 并且想要一种删除冗余跨度元素的方法。我在想 AngleSharp 或 html-agility-pack 应该能够做到这一点,但我不确定这是最好的方法吗?
我最后做的是遍历所有元素,当检测到相邻的 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;
}