2013-04-18 2 views
1

Я действительно надеюсь, что кто-то может помочь мне с этой проблемой. Решение должно быть на C#.C# Strip HTML Markup в XML

У меня есть xml-файл размером 36 МБ и с линиями 900 КБ. На некоторых узлах имеет много HTML-разметки и некоторые недопустимую разметку, как

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

Я пробовал различные способы очистки этого файла, но только один из способов может выполнить задачу, однако, как это выполняется в веб-приложении, оно блокирует приложение и занимает около 6 минут для завершения задачи и потребляет около 450 МБ в памяти.

Поскольку этот файл является недопустимым xml, я не могу использовать XmlTextReader. Использование XLST, основанный на Strip HTML-like characters (not markup) from XML with XSLT?, странно, я тоже с проблемами с HTML-сущностями.

Процесс, который работал (с некоторыми ухищрениями) является следующим по http://www.codeproject.com/Articles/19652/HTML-Tag-Stripper

Благодарности

Edit:

После предложения Кевина. Я пытаюсь создать решение с помощью пакета Agility Pack. По крайней мере, чтобы сделать некоторые тесты. Я застрял. Представьте себе следующий XML-узел:

<Obs><p> I WANT THIS TEXT<jantes -="" .="" 22.000="" apenas="" exclusive="" kms.="" leve="" liga="" o=""> </jantes></p></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 часов и потребляет 800 МБ в памяти.

По-прежнему нужна помощь!

Вот код, это может помочь кому-то.

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

 Смежные вопросы

  • Нет связанных вопросов^_^