2016-07-07 13 views
0

Ich muss Word in HTML konvertieren, die ich mit Aspose tun und das funktioniert gut. Das Problem ist, dass es einige redundante Elemente erzeugt, von denen ich denke, dass sie auf die Art und Weise zurückzuführen sind, wie der Text in einem Wort gespeichert wird.mit C# entfernen Sie doppelte HTML-Span-Elemente

Zum Beispiel in meinem Word-Dokument der Text erscheint:

Genehmigung zur Freisetzung

Wenn umgewandelt html es wird:

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

I C# bin mit und würde einen Weg gerne um die redundanten Bereichselemente zu entfernen. Ich denke, entweder AngleSharp oder html-agility-pack sollte dazu in der Lage sein, aber ich bin mir nicht sicher, ob das der beste Weg ist?

+0

Es ist nicht klar, was Sie anrufen * redundantes Element *. Im obigen Beispiel sieht es nicht so aus, als wäre eines Ihrer Span-Elemente redundant. Wenn Sie den erzeugten HTML-Code loswerden wollen und einfach den Text greifen wollen, können Sie sich auf '[diese Span-Elemente übergeordnete] .InnerText' beziehen. Der gesamte Text, der von Word in HTML konvertiert wurde - wird in Span-Tags platziert, die genau so aussehen? – Veverke

+0

Was ich meinte ist, dass ich möchte, dass das HTML wie folgt aussieht: ERMÄCHTIGUNG ZUR FREIGABE ksprague

Antwort

0

Was ich getan habe, ist über alle Elemente iterieren und wenn angrenzende Span Elemente erkannt wurden, verkettete ich den Text zusammen. Hier ist ein Code, wenn andere auf dieses Problem stoßen. Notiz-Code könnte einige Bereinigung verwenden.

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; 
} 
Verwandte Themen