2016-07-07 12 views
0

私はAsposeでやっている単語をhtmlに変換する必要があり、うまくいきます。問題は、テキストが単語に格納される方法によるものと思われるいくつかの冗長な要素を生成していることです。例えばC#を使用して重複したhtmlスパン要素を取り除く

私のワード文書に以下のテキストが表示されます:RELEASE

FOR

AUTHORIZATIONを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のいずれかがこれを行うことができるはずだと思っていますが、これが最善の方法であるとは思わないでしょうか?

+0

あなたは*冗長要素*と呼んでいるかは不明です。上記の例では、スパン要素のいずれかが冗長であるようには見えません。作成したHTMLを取り除き、テキストを取りたい場合は、 '[これらのspan要素の親] .InnerText'を参照することができます。 wordからhtmlに変換されたすべてのテキストは、これらとまったく同じように見えるspanタグに置かれていますか? – Veverke

+0

私が言ったのは、htmlが次のようになることです。リリースの承認 ksprague

答えて

0

すべての要素に対して繰り返し処理を行い、隣接するスパン要素が検出されたときにテキストを結合しました。他の人がこの問題に遭遇すると、いくつかのコードがあります。ノートコードでクリーンアップを使用することができます。

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; 
} 
関連する問題