본문 바로가기
Language/C#

c# xml 파일 파싱하기

by ninanio3 2011. 12. 30.

xml파일을 파싱한다.

1. xml파일을 자른다.
2. 배열에 넣는다.
3. 콘솔창에 출력한다.


파싱파일



xml파일을 가져오는 것은
 
string text = System.IO.File.ReadAllText(@"C:\parsingfile.txt");

이 코드로 가져올 수 있다.


1. 배열을 선언하는 방법. 배열 컬럼을 먼저 만들어야 한다고 생각을 했다.
string[] arr = new string[]{string name, string hello1, string hello2, string hello3}; 이것도 아니고,
string[] arr = [string name, string hello1, string hello2, string hello3]; 이것도 아니고, 어떻게 선언을 해야할지...

2. 필요한 부분만 잘라서 배열에 넣는 방법... name의 다음 글자를 찾아서 쓰는건지, 아니면 필요없는 글자를 다 지워야 하는지... 필요없는 글자를 지우는 것은 아닌 것 같다. 필요한 글자를 찾아서 잘라서 넣는 방법...

3. 출력이야 Console.WriteLine("{0}", arr[]); 이런식으로 하면 될 것 같은데... 배열... 감이 잘 안잡힌다. ㅠㅠ


아무래도 Split에는 어마어마한 힘이 숨어있는 것 같다. 긴 문장도 원하는 곳을 잘라내어 차곡차곡 배열에 쌓아놓는다. StreamReader와 함께말이다. my name = rabbit 이 코드에서 split을 =로 하면(sr.split('=')) 배열에 차곡차곡 쌓아놓는다.


파싱을 하는데 있어서 문자열을 자르고 나누고 붙이는 것들을 이해하는게 가장 중요하다고 생각한다.
내가 사용했던 메소드 중에서 좀 쉽다고 느끼는 것은
.Replace("Old  Char", "New Char")     //문자를 찾아서 바꾼다.
.Split("Char[] seperator")    // 해당 문자를 기준으로 잘라서 배열에 넣는다. Char[]에 Bracket이 들어간 이유다.
.Trim()    //공백을 지운다. 이 코드에서 쓰지는 않았지만 자주 쓰이는 코드이다.

정도이고, 좀 어렵다고 느꼈던 것은
.IndexOf("Char")    //앞에서부터 문자 인덱스를 찾아서 문자 인덱스의 위치를 int형으로 반환한다.
.LastIndexOf("Char")    //뒤에서부터 문자 인덱스를 찾아서 문자 인덱스의 위치를 int형으로 반환한다.
.Substring(start Index, length)    //문자를 자른다. start Index는 int형으로 start Index위치부터 length에서
                                              //지정한 길이만큼 자른다. IndexOf와 함께 쓰이면 막강하다 ㅎㅎ

나도 처음에 해봤을 때 어려웠는데, 모르면 감도 안잡히고 하나도 모른다. 알면 너무 쉽다. ㅎㅎ 이런재미 ^^

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Collections;
  7.  
  8. namespace Exercise
  9. {
  10.     class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             string path = @"C:\parsingfile.txt";
  15.             string temp = "";
  16.             string temp2 = "";
  17.             string temp3 = "";
  18.             string temp4 = "";
  19.             string hello = "";
  20.             string[] vHello = new string[2];
  21.             string[] vSize = new string[2];
  22.             string[] vColor = new string[2];
  23.  
  24.             StreamReader sr = null;
  25.             string line = "";
  26.             string[] itemValue;
  27.  
  28.             sr = new StreamReader(path);
  29.             try
  30.             {
  31.                 while (!sr.EndOfStream)
  32.                 {
  33.                     line = sr.ReadLine().Replace("<", "").Replace(">", "").Replace("?", "").Replace("/></font><br/>", "");
  34.                     int cnt = line.LastIndexOf("hello");
  35.                     int cnt2 = line.LastIndexOf("size");
  36.                     int cnt3 = line.LastIndexOf("color");
  37.                     int cnt4 = line.LastIndexOf("name");
  38.                     if (cnt > 0)
  39.                     {
  40.                         //Hello 앞뒤 나누기
  41.                         temp = line.Substring(cnt);  //Hello 후 <- 값있음
  42.                         temp2 = line.Substring(0, cnt - 1);  //Hello 전
  43.                         hello = temp.Substring(0, temp.IndexOf("/"));
  44.                         vHello = hello.Split('=');
  45.                         Console.WriteLine("{0} = {1}", vHello[0], vHello[1]);
  46.                         //size 앞뒤 나누기
  47.                         if (cnt2 > 0)
  48.                         {
  49.                             temp3 = temp2.Substring(cnt2).Replace("xsl:value-of", "");  //Size 후 <- 값있음
  50.                             temp4 = temp2.Substring(0, cnt2 - 1);  //Size 전
  51.                             vSize = temp3.Split('=');
  52.                             Console.WriteLine("{0} = {1}", vSize[0], vSize[1]);
  53.                             //color 앞뒤 나누기
  54.                             if (cnt3 > 0)
  55.                             {
  56.                                 temp4 = temp4.Replace(" ", "").Replace("\t", "");
  57.                                 vColor = temp4.Split('=');
  58.                                 Console.WriteLine("{0} = {1}", vColor[0], vColor[1]);
  59.                             }
  60.                         }
  61.                     }
  62.                     else if (cnt4 > 0)
  63.                     {
  64.                         temp = line.Substring(cnt4);
  65.                         itemValue = temp.Split('=');
  66.                         Console.WriteLine("{0} = {1}", itemValue[0], itemValue[1]);
  67.                     }
  68.                     Console.WriteLine();
  69.                 }
  70.             }
  71.             catch (Exception ex)
  72.             {
  73.                 Console.WriteLine(ex.ToString());
  74.             }
  75.         }
  76.     }
  77. }


이게 정답은 아니다. 해당 메소드들을 잘 이용하여 자기가 원하는 방법으로 문자를 찾고 자르고 붙이면 된다. 나는 77줄이나 필요했지만, 50줄에 끝내는 방법도 있고 100줄도 넘길 수도 있다. 그건 자기 하기 나름이다.



아래는 참고자료임.

split Method 사용법... msdn에서 퍼왔음

class TestStringSplit
{
    static void Main()
    {
        char[] delimiterChars = { ' ', ',', '.', ':', '\t' };

        string text = "one\ttwo three:four,five six seven";
        System.Console.WriteLine("Original text: '{0}'", text);

        string[] words = text.Split(delimiterChars);
        System.Console.WriteLine("{0} words in text:", words.Length);

        foreach (string s in words)
        {
            System.Console.WriteLine(s);
        }
    }
}



파싱과 관련된 사이트 http://findfun.tistory.com/entry/C-HTML-파싱해서-원하는-정보-가져오기

'Language > C#' 카테고리의 다른 글

c# 오류목록 정리  (0) 2012.01.03
c# parsing  (0) 2012.01.02
c# Boxing, UnBoxing  (0) 2011.12.30
c# 배열의 개념이 들어간 버블정렬  (0) 2011.12.24
c# do while문  (0) 2011.12.24