1

我真的希望有人可以帮助我解决这个问题。解决方案应该在 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,基于使用 XSLT 从 XML 中去除类似 HTML 的字符(不是标记)?,奇怪的是我也遇到了 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”并保留文本“I WANT THIS TEXT”?基本上是这样的:

<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;
4

1 回答 1

4

您是否尝试过Html 敏捷包?在其主张中:

  • 解析器对“真实世界”格式错误的 HTML 非常宽容
  • 你可以按照你想要的方式修复页面,修改 DOM,添加节点,复制节点,嗯......你命名它
于 2013-04-18T18:13:42.437 回答