http://www.anddev.org/parsing_xml_from_the_net_-_using_the_saxparser-t353.html
를 보고 SAX를 따라 하는 중인데.. 우선 xml내용을 보면

<?xml version="1.0" ?>
<outertag>
  <innertag sampleattribute="innertagAttribute">
    <mytag>anddev.org rulez =)</mytag>
    <tagwithnumber thenumber="1337" />
  </innertag>
</outertag>

요로코롬 돼있다.
파싱 법은 쉽게 두개.. (라고 생각하면 되나?)라고 생각하면 될텐데
위의 예제에서 보면
<mytag>부터 </mytag> 사이에 있는 글을 뽑아오는 파싱이 필요 할 것이고..
<tagwithnumber thenumber="1337" /> 에서 thenumber=VALUE의 VALUE를 뽑아오는 파싱이 필요할 것이고..
여튼 이건 다음에 쓰도록 하고..

startElement에서 boolean mytag를 true해주고 endElement에서 mytag를 false해주고..
characters에서는 mytag가 true일 때의 값들을 다 읽어오게 해줬는데..
위의 예제대로 하면.. 값이 안나온다..

그래서 로그를 찍어보니... characters를 계속 읽으면서 기존에 제대로된 값을 읽었다 해도 지워지게 되더라.. 뭥미??
그래서..
StringBuffer로 변수를 하나 선언해서 들어오는 대로 죄다 append하도록 시켜줬더니... 들어오는 값이
'                       anddev.org rulez =)            '
이렇게.. 엄청난 공백과 함께 들어와 있었다. (참고로 이건 단순 스페이스가 아니였음.)

이걸 처리해 주기 위해 어떻게 해야하나 고초를 겪다가 아래와 같은 코드를 내놨다.

StringBuffer strbufTmp = new StringBuffer();

 @Override
 public void characters(char ch[], int start, int length){
     if(this.in_mytag){
         for(int i = start;i < start+length;i++){
             switch(ch[i]){
             case '\r':
                 break;
             case '\t':
                 break;
             case '\n':
                 break;
             default:
                 strbufTmp.append(ch[i]);
                 break;
             }

         }
     myParsedExampleDataSet.setExtractedString(strbufTmp.toString());
     }
 }

위와 같이.. strbufTmp를 하나 선언해서 '문자' 단위로 append를 통해 늘려주도록..
하지만 공백이 들어올 경우에는 과감히 pass처리하도록.. 해줬다. (switch안의 내용은 구미에 맞게 변경하면 될 듯)

이렇게 하니까
'                       anddev.org rulez =)            '
이랬던 녀석이
'anddev.org rulez =)'
이렇게 잘 들어오더라~

오늘의 삽질도 이렇게 흘러흘러간다...

저작자 표시 비영리 변경 금지
신고
블로그 이미지

roter

JHB / Peripheral Programmer

댓글을 달아 주세요