С помощью C# удалить дубликаты HTML-элементов span
Я должен преобразовать слово в HTML, что я делаю с Aspose, и это работает хорошо. Проблема в том, что он создает некоторые избыточные элементы, которые, я думаю, связаны с тем, как текст хранится в слове.
Например, в моем словесном документе появляется текст ниже:
РАЗРЕШЕНИЕ НА ВЫПУСК
При преобразовании в 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 должны быть в состоянии сделать это, но я не уверен, что это лучший способ?
1 ответ
Решение
В итоге я перебираю все элементы, и, когда соседние элементы 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;
}