2013-04-18 152 views
1

我真的很希望有人能帮助我解决这个问题。解决方案应该在C#上。C#在HTML中标记HTML标记

我有一个大小为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; 

谢谢:)

EDIT 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

您试过Html Agility Pack?在它的要求:

  • 解析器很宽容与“现实世界”恶意的HTML
  • 您可以修复页面,你所希望的方式,修改DOM,增加节点,复制节点,以及..你的名字
+0

不喜欢Html Agility Pack的目的。虽然它非常强大。但它花了我4个小时来“清理”文件:( – blindado