2016-03-15 59 views
2

我有谷歌所有可能的方式來將HTML轉換爲不同類型的HTML(我猜它的HTML 5)。我get得幸運。我想使用HtmlAgility包轉換HTML

<DIV STYLE="text-align:Left;font-family:Segoe UI;font-style:normal;font-weight:normal;font-size:12;color:#000000;"> 
    <UL STYLE="margin:0 0 0 0;padding:0 0 0 0;"> 
     <LI STYLE="margin:0 0 0 24;"> 
      <P STYLE="font-family:Microsoft Sans Serif;font-weight:bold;font-size:11.333333333333332;margin:0 0 0 0;"> 
       <SPAN> 
        <SPAN>open paint</SPAN> 
       </SPAN> 
      </P> 
     </LI> 
     <LI STYLE="margin:0 0 0 24;"> 
      <P STYLE="font-family:Microsoft Sans Serif;font-weight:bold;font-size:11.333333333333332;margin:0 0 0 0;"> 
       <SPAN> 
        <SPAN>open calc</SPAN> 
       </SPAN> 
      </P> 
     </LI> 
    </UL> 
</DIV> 

改造這個(markup of RTF editor converted to HTML)標記使用HtmlAgilityPack(nicEditor標記)

<UL> 
    <LI> 
     <STRONG>open paint</STRONG> 

    </LI> 
    <LI> 
     <STRONG>open calc</STRONG> 
    </LI> 
</UL> 

。我試圖遍歷html標記,並手動替換我想要的第二個標記。它有一些問題。我無法正確地轉換開始和結束標籤,並應用格式化的CSS。我從rtf編輯器使用nicEditor

以下是我正在嘗試使用手動轉換它的c#代碼。

private string transformHTML(string strTransform) 
     { 
      string final = ""; 
      if (WebUtility.HtmlDecode(strTransform).StartsWith("<DIV") || WebUtility.HtmlDecode(strTransform).StartsWith("<HTML")) 
      { 
       HtmlAgilityPack.HtmlDocument resultat = new HtmlAgilityPack.HtmlDocument(); 
       string source = WebUtility.HtmlDecode(strTransform); 
       resultat.LoadHtml(source); 
       string o = resultat.DocumentNode.OuterHtml; 


       List<string> startStringList = new List<string>(); 
       List<string> lastStringList = new List<string>(); 
       List<string> innerTextList = new List<string>(); 
       List<string> newLine = new List<string>(); 
       StringBuilder sb = new StringBuilder(); 
       string innterText = ""; 
       string child = ""; 



       foreach (HtmlNode node in resultat.DocumentNode.Descendants()) 
       { 

        switch (node.Name.ToLower()) 
        { 
         case "ul": 
          startStringList.Add("<UL>"); 
          lastStringList.Add("</UL>"); 
          break; 

         case "li": 
          startStringList.Add("<LI>"); 
          lastStringList.Add("</LI>"); 
          break; 

         case "span": 
          if (!innerTextList.Contains(node.InnerText.Trim())) 
           innerTextList.Add(node.InnerText.Trim());// = node.InnerText; 
          foreach (var item in node.Attributes) 
          { 
           string values = item.Value; 
           values = values.ToLower(); 
           if (values.Contains("FONT-WEIGHT:".ToLower())) 
           { 
            string wt = values.Split(new string[] { "FONT-WEIGHT:".ToLower() }, StringSplitOptions.None)[1].ToString(); 
            if (wt.Trim().Split(';')[0].ToLower() == "bold") 
            { 
             startStringList.Add("<STRONG>"); 
             lastStringList.Add("</STRONG>"); 
            } 
           } 
           if (values.Contains("FONT-STYLE:".ToLower())) 
           { 
            string wt = values.Split(new string[] { "FONT-STYLE:".ToLower() }, StringSplitOptions.None)[1].ToString(); 
            if (wt.Trim().Split(';')[0].ToLower() == "italic") 
            { 
             startStringList.Add("<I>"); 
             lastStringList.Add("</I>"); 
            } 
           } 

           if (values.Contains("TEXT-DECORATION:".ToLower())) 
           { 
            string wt = values.Split(new string[] { "TEXT-DECORATION:".ToLower() }, StringSplitOptions.None)[1].ToString(); 
            if (wt.Trim().Split(';')[0].ToLower() == "underline") 
            { 
             startStringList.Add("<U>"); 
             lastStringList.Add("</U>"); 
            } 
           } 
          } 
          break; 
         case "p": 
          foreach (var item in node.Attributes) 
          { 
           string values = item.Value; 
           values = values.ToLower(); 
           if (values.Contains("text-align:".ToLower())) 
           { 
            string wt = values.Split(new string[] { "text-align:".ToLower() }, StringSplitOptions.None)[1].ToString(); 
            if (wt.Trim().Split(';')[0].ToLower() == "Center".ToLower()) 
            { 
             startStringList.Add("<P align=center>"); 
             lastStringList.Add("</P>"); 
            } 

            if (wt.Trim().Split(';')[0].ToLower() == "Right".ToLower()) 
            { 
             startStringList.Add("<P align=right>"); 
             lastStringList.Add("</P>"); 
            } 

            if (wt.Trim().Split(';')[0].ToLower() == "justify".ToLower()) 
            { 
             startStringList.Add("<P align=justify>"); 
             lastStringList.Add("</P>"); 
            } 
            if (wt.Trim().Split(';')[0].ToLower() == "left".ToLower()) 
            { 
             startStringList.Add("<P align=left>"); 
             lastStringList.Add("</P>"); 
            } 
           } 
           if (values.Contains("FONT-WEIGHT:".ToLower())) 
           { 
            string wt = values.Split(new string[] { "FONT-WEIGHT:".ToLower() }, StringSplitOptions.None)[1].ToString(); 
            if (wt.Trim().Split(';')[0].ToLower() == "bold") 
            { 
             startStringList.Add("<STRONG>"); 
             lastStringList.Add("</STRONG>"); 
            } 
           } 
           if (values.Contains("FONT-STYLE:".ToLower())) 
           { 
            string wt = values.Split(new string[] { "FONT-STYLE:".ToLower() }, StringSplitOptions.None)[1].ToString(); 
            if (wt.Trim().Split(';')[0].ToLower() == "italic") 
            { 
             startStringList.Add("<I>"); 
             lastStringList.Add("</I>"); 
            } 
           } 

           if (values.Contains("TEXT-DECORATION:".ToLower())) 
           { 
            string wt = values.Split(new string[] { "TEXT-DECORATION:".ToLower() }, StringSplitOptions.None)[1].ToString(); 
            if (wt.Trim().Split(';')[0].ToLower() == "underline") 
            { 
             startStringList.Add("<U>"); 
             lastStringList.Add("</U>"); 
            } 
           } 
          } 
          break; 
        } 
       } 

       lastStringList.Reverse(); 
       foreach (var item1 in startStringList) 
       { 
        final += item1; 

       } 
       foreach (var item3 in innerTextList) 
       { 
        final += item3 + "<br>"; 


       } 
       final += innterText; 
       foreach (var item2 in lastStringList) 
       { 
        final += item2; 
       } 

      } 
      return final; 
     } 

回答

0

我會考慮使用XDocument和XElement來完成這個任務。

只要你能夠控制什麼地方,你就會更容易使用XML結構來做HTML。這裏有一個例子:

http://www.dotnetperls.com/xelement

但是,如果你搜索周圍的的XDocument的XElement,你會發現關於這個問題噸文檔。

但爲了上帝的緣故,使用小寫:)

+0

我不知道這篇文章是關於什麼。我對這類東西相當陌生。不管怎麼說,多謝拉。 – user2998990

+0

試試這個:https://msdn.microsoft.com/en-us/library/bb387061.aspx對不起,我假設你有一些經驗,這個鏈接解釋瞭如何使用xml,這基本上是你想要構造的HTML –