使用 HtmlAgility 包转换 HTML

Posted

技术标签:

【中文标题】使用 HtmlAgility 包转换 HTML【英文标题】:Transform HTML using HtmlAgility pack 【发布时间】:2016-06-30 11:00:56 【问题描述】:

我在谷歌上有所有可能的方法来将 html 转换为不同类型的 HTML(我猜它的 HTML 5)。我很幸运。我正在尝试转换这个(markup of RTF editor converted to 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>

到(nicEditor 标记)

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

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

使用HtmlAgilityPack。我正在尝试遍历 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;
        

【问题讨论】:

【参考方案1】:

我会考虑使用 XDocument 和 XElement 来完成这项繁重的任务。

只要你能控制去哪里,你就可以更容易地使用 XML 结构来编写 html。这里有一个例子:

http://www.dotnetperls.com/xelement

但是,如果您搜索 XDocumentXElement,您会发现大量关于该主题的文档。

但是看在上帝的份上,请使用小写:)

【讨论】:

我不知道这篇文章是关于什么的。我对这种东西还很陌生。感谢任何方式。 试试这个:msdn.microsoft.com/en-us/library/bb387061.aspx 对不起,我假设你有一些经验,这个链接解释了如何使用 xml,这基本上就是你想要构建的 html

以上是关于使用 HtmlAgility 包转换 HTML的主要内容,如果未能解决你的问题,请参考以下文章

HTML 敏捷包选择节点

使用 C# 和 HTMLAgility 抓取网页

HtmlAgility - 将解析保存到字符串

使用 html agility xpath 查找 webdriver 元素

Html Agility Pack:查找评论节点

使用 HTML Agility 去除 HTML 标签但留下内部文本?