2016-03-15 70 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 –