퇴근5분전

KT에 잠깐 있을때 부탁받았던 내용인데

특정 테이블 폼을 파싱해서 HTML테이블과 데이타만 남기고 이를 dataTable로 만들어서 쿼리를 만드는 프로그램을 만들고 있었음.

이후.. 옆에 동료의 사정에 귀기울여 만들던 것을 멈췄음.

정규식을 모를때라서 이렇게 된다!!
<로 시작해서 > 끝나는걸 찾아서 Table관련 태그면 그에 맞춰서 작업했던 기억이 남.



  #region  HTML 태그 제거

  /*  TD태그 안에 다른 태그들 삭제! */
  string TdFilter(string TDString)
  {
   System.Text.StringBuilder  sb  = new System.Text.StringBuilder(); 
     
   // Name  =      2테이블1Row 1Col 은 name

   // TableData =  3테이블1Row는 컬럼명
   //           =  3테이블2Row부터는 데이타


   if( TDString.IndexOf("<",0) == -1 ||  TDString.IndexOf(">",0) == -1 || TDString.IndexOf("html",0) == -1 ||  TDString.IndexOf("head",0) == -1)
   {
    MessageBox.Show("완전한 html이 아닙니다.","Warning - [html, head 미포함!]", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    return TDString;
   }

   string strTagArea = string.Empty;   
   int   sIndx = 0;
   int   eIndx = 0;
   int   cnt  = 0;

   int TableDepthCnt  =  0; 
   int TrCnt = 0;
   int TdCnt  = 0;

   string TagName = "";

   
   DataRow dr = dt.NewRow();

   try
   {
    foreach( char cc in TDString)
    {
     if( cc.CompareTo('<') == 0 )
     {
      // > ~ (<)
      if( cnt > eIndx)
      {
       strTagArea = TDString.Substring( eIndx + 1 ,cnt -  eIndx -1 );
       sb.Append( strTagArea.Replace(Environment.NewLine,"").Replace("\n","").Replace("\t","").Trim());
     
       switch(TagName)
       {
        case "TD":
         if( TableDepthCnt == 2 && TrCnt == 1 && TdCnt == 1)
         {
          dt.TableName = strTagArea;
         }
         else if(TableDepthCnt == 3 && TrCnt == 1)
         {          
          dt.Columns.Add( strTagArea );          
         }
         else if(TableDepthCnt == 3 && TrCnt > 1)
         {           
          dr[ TdCnt - 1 ] = strTagArea;
         }
         break;
        case "TR":
         if( TableDepthCnt == 3 && TrCnt > 1 )
         {          
          dr = dt.NewRow();
         }
         break;
        case "</TR>":
         if( TableDepthCnt == 3 && TrCnt > 1)
         { 
                    
          dt.Rows.Add( dr );                
         }
         break;
       }
      }   
      sIndx  = cnt;
     }
     else if( cc.CompareTo('>') == 0)
     {     
      eIndx = cnt;
      strTagArea = TDString.Substring( sIndx , eIndx - sIndx + 1 );
      if( strTagArea.Substring(1,2).ToUpper().CompareTo("TD") == 0 )
      { 
       TagName = strTagArea.Substring(1,2).ToUpper();    
       sb.Append( strTagArea + Environment.NewLine); 
       TdCnt++;
      }
      else if( strTagArea.ToUpper().CompareTo("</TD>") == 0)
      {
       TagName = strTagArea.ToUpper();
       sb.Append( strTagArea + Environment.NewLine); 
      }
      else if(strTagArea.Substring(1,2).ToUpper().CompareTo("TR") == 0 )
      {
       TagName = strTagArea.Substring(1,2).ToUpper();
       TrCnt ++;
       TdCnt = 0;      
       sb.Append( strTagArea + Environment.NewLine);
      }
      else if ( strTagArea.ToUpper().CompareTo("</TR>") == 0)
      {    
       TagName = strTagArea.ToUpper();
       sb.Append( strTagArea + Environment.NewLine); 
      }
      else if(strTagArea.Substring(1,2).ToUpper().CompareTo("TA") == 0 )
      {   
       TagName  = strTagArea.Substring(1,2).ToUpper();
       TableDepthCnt ++;
       TrCnt = 0;
       TdCnt  = 0;
       sb.Append( strTagArea + Environment.NewLine); 
      }
      else if(strTagArea.ToUpper().CompareTo("</TABLE>") == 0)
      {     
       TagName = strTagArea.ToUpper();
       sb.Append( strTagArea + Environment.NewLine);       
      }         
     }
     cnt++;
    }
   }
   catch{}
   this.dataGrid1.DataSource = dt;
   this.Text = dt.Rows.Count.ToString();
   return sb.ToString();
  }


참길다!!


<html><head>
<body>
<table>
 <tr><td></td><td></td>
 </tr>
</table>
<table>
 <tr><td>TableA </td><td></td>
 </tr>
</table>
<table>
 <tr><td> A </td><td>B</td></tr>
 <tr><td>1</td><td>2</td></tr>  
 <tr><td>1</td><td>2</td></tr>  
 <tr><td>1</td><td>2</td></tr>  
 <tr><td>1</td><td>2</td></tr>  
 <tr><td>1</td><td>2</td></tr>  
</table>
</body>
</head></html>

이런 소스를  DataTable로 만든후 쿼리를 만들려고 했었음.

적용후 나오는 DataTable을 DataGrid에 담은 모습임.




'# 2) .Net ( Vs 2005 ) > 기타' 카테고리의 다른 글

트리뷰] 트리뷰 노드추가하기 2  (0) 2009.05.09
트리뷰] 트리뷰 노드추가하기 1  (0) 2009.05.09
게임 챗팅창처럼...  (0) 2009.05.09
드레그 앤 드랍! (2)  (0) 2009.05.09
드래그 앤 드랍!  (0) 2009.05.09