2013-04-18 6 views
1

누군가가이 문제를 해결할 수 있기를 바랍니다. 솔루션은 C#에 있어야합니다.C# XML에서 HTML 마크 업 사용

36MB 크기와 900k 라인의 xml 파일이 있습니다. 일부 노드에서이 같이 HTML 마크 업의 많은 나는이 파일을 청소하지만, 단 하나의 방법은 그러나, 작업을 수행 할 수있는 여러 가지 방법을 시도했습니다

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

같은 몇 가지 잘못된 마크 업을 가지고 이것은 웹 애플리케이션에서 실행되고 있습니다. 애플리케이션을 차단하고 작업을 완료하고 메모리에서 약 450MB를 소비하는 데 약 6 분이 걸립니다.

이 파일은 유효하지 않은 xml이므로 XmlTextReader를 사용할 수 없습니다. XLST를 사용하여 Strip HTML-like characters (not markup) from XML with XSLT?을 기반으로, 이상하게도 HTML 엔터티에 문제가 있습니다. 케빈의 제안에 따라

:

(일부 비틀기와 함께) 작업 과정은 http://www.codeproject.com/Articles/19652/HTML-Tag-Stripper

감사

편집에 다음과 같다. HTML 민첩성 팩을 사용하여 솔루션을 작성하려고합니다. 적어도 벤치 마크를 수행해야합니다. 그러나 나는 붙어 있어요.

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

어떻게 내가 태그 "OBS를"유지 "OBS"태그 안에 태그를 제거하고 또한 텍스트 "나는이 텍스트를 원하십니까"를 유지할 수 있습니다 : 다음 XML 노드를 상상? 기본적으로이 : 내가 작업을 완료 할 수 있었다 2

확인

 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; 

감사합니다 :)

편집 :

<Obs>I WANT THIS TEXT</Obs> 

지금은이 내가 한 코드는 . 그러나 이것은 너무 많은 시간이 걸립니다. 약 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을 사용해 보셨습니까? 그 주장 중 :

  • 파서는 "현실 세계"당신이 잘, 페이지에게 당신이 원하는 방식으로 해결 DOM을 수정, 노드를 추가, 노드를 복사 할 수 있습니다
  • 잘못된 HTML 매우 관대하다 .. 당신은 그것을 이름
+0

목적을 위해 Html 민첩성 팩을 좋아하지 않았어. 그것은 매우 강력합니다. 하지만 파일을 "정리"하는 데 4 시간이 걸렸습니다. ( – blindado