C#以XML格式剥离HTML标记

时间:2013-04-18 17:07:10

标签: c# html xml strip-tags xmltextreader

我真的希望有人可以帮我解决这个问题。解决方案应该在C#上。

我有一个大小为36 MB且有900k行的xml文件。在某些节点上,它有很多html标记和一些无效标记,如

<Obs><p>
<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p>

我尝试过不同的方法来清理这个文件,但只有一种方法可以执行任务,但是,由于这是在Web应用程序上执行它阻止应用程序并花费大约6分钟来完成任务和消耗内存大约450MB。

由于此文件是无效的xml,我无法使用XmlTextReader。 使用XLST,基于Strip HTML-like characters (not markup) from XML with XSLT?,奇怪的是我也遇到了HTML实体的问题。

http://www.codeproject.com/Articles/19652/HTML-Tag-Stripper

上有以下工作(通过一些调整)

由于

修改

遵循凯文的建议。我正在尝试使用HTML Agility Pack构建解决方案。 至少要做一些基准测试。 然而,我被困住了。想象一下以下的xml节点:

<Obs><p> I WANT THIS TEXT<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p></Obs>

如何剥离“obs”标签内的标签,保留标签“obs”并保留“我想要这个文字”的文字?基本上这个:

<Obs>I WANT THIS TEXT</Obs>

现在这是我的代码:

        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(text);
        Queue<HtmlNode> nodes = new Queue<HtmlNode>(doc.DocumentNode.SelectNodes("./*|./text()"));
        while (nodes.Count > 0)
        {
            HtmlNode node = nodes.Dequeue();
            HtmlNode parentNode = node.ParentNode;

            HtmlNodeCollection childNodes = node.SelectNodes("./*|./text()");

            if (childNodes != null)
            {
                foreach (HtmlNode child in childNodes)
                {
                    if (child.Name != "obs")
                    {
                        nodes.Enqueue(child);
                    }
                    else
                    {
                        childNodes = child.SelectNodes("//p|//jantes");
                        foreach (HtmlNode nodeToStrip in childNodes)
                            nodeToStrip.ParentNode.RemoveChild(nodeToStrip);
                    }
                }
            }
        }
        string s = doc.DocumentNode.InnerHtml;

谢谢:)

编辑2

好的,我能够完成任务。然而,这花费了太多时间。大约3个小时,内存消耗800MB。

仍然需要帮助!

这是代码,它可能对某人有帮助。

HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(text);
        Queue<HtmlNode> nodes = new Queue<HtmlNode>(doc.DocumentNode.SelectNodes("./*|./text()"));
        while (nodes.Count > 0)
        {
            HtmlNode node = nodes.Dequeue();
            HtmlNode parentNode = node.ParentNode;

            HtmlNodeCollection childNodes = node.SelectNodes("./*|./text()");

            if (childNodes != null)
            {
                foreach (HtmlNode child in childNodes)
                {
                    if (child.Name != "obs")
                    {
                        nodes.Enqueue(child);
                    }
                    else
                    {
                        childNodes = child.SelectNodes("//p|//jantes");
                        if (childNodes != null)
                        {
                            foreach (HtmlNode nodeToStrip in childNodes)
                            {
                                var replacement = doc.CreateTextNode(nodeToStrip.InnerText);
                                nodeToStrip.ParentNode.ReplaceChild(replacement, nodeToStrip);
                            }
                        }
                    }
                }
            }
        }
        string s = doc.DocumentNode.InnerHtml;

1 个答案:

答案 0 :(得分:4)

你试过Html Agility Pack吗?在其声明中:

  
      
  • 解析器非常容忍“真实世界”格式错误的HTML
  •   
  • 你可以按照你想要的方式修改页面,修改DOM,添加节点,复制节点,以及......你的名字
  •