3. Implementation/Markup Language

SAX 핸들러 구현

SSKK 2008. 8. 30. 23:45
1. SAX 핸들러 구현의 간단화

필요한 메서드만을 오버라이딩 하여 구현할 수 있도록 이 인터페이들 모두 상속하여 각 인터페이스에 정의되어 있는 abstract 메서드들을 오버라이딩한 DefaultHandler 클래스를 사용한다.



2. 특정 요소만 추출하여 XML 문서 작성하는 SAX 예제

import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
class SAXSample04 {
     public static void main(String args[]) throws Exception {
          //SAX를 준비한다
          SAXParserFactory spf
                = SAXParserFactory.newInstance();
          SAXParser sp = spf.newSAXParser();
          //핸들러를 준비한다
          SampleHandler04 sh = new SampleHandler04();
          //문서를 읽어들인다
          sp.parse(new FileInputStream("student.xml"), sh);
     }
}
//핸들러 클래스
class SampleHandler04 extends DefaultHandler {
     //문자열을 준비한다
     StringBuffer sb = new StringBuffer();
     boolean isPrint = false;
     //문서의 시작
     public void startDocument() {
          sb.append
          ("<?xml version=\"1.0\" encoding=\"EUC-KR\" ?>");
          sb.append("<초등학생>");
     }
     //문서의 종료
     public void endDocument() {
          sb.append("</초등학생>");
          //문자열을 써넣는다
          try{
               PrintWriter pw = new PrintWriter
                         (new BufferedWriter
                         (new FileWriter("result04.xml")));
                    pw.println(sb);
               pw.close();
          }catch(Exception e){} 
     }
     //요소의 시작
     public void startElement(String namespaceURI, String localName,
                                       String qName, Attributes attrs) {
          if(qName.equals("이름")){
               sb.append("<" + qName + ">");
               isPrint = true;
          }
     }
     //요소의 종료
     public void endElement(String namespaceURI, String localName,
                                       String qName) {
          if(qName.equals("이름")){
               sb.append("</" + qName + ">");
               isPrint = false;
          }
     }
     //문자 데이터
     public void characters(char[] ch, int start,int length) {
          String str = new String(ch, start, length);
          if(str.trim().length() != 0 && isPrint == true){
               sb.append(str);
          }
     }
}

3. 특정 속성만 추출하여 XML 문서 작성하는 SAX 예제

import java.io.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
class SAXSample05 {
     public static void main(String args[]) throws Exception {
          //SAX를 준비한다
          SAXParserFactory spf = SAXParserFactory.newInstance();
          SAXParser sp = spf.newSAXParser();
          //핸들러를 준비한다
          SampleHandler05 sh = new SampleHandler05();
          //문서를 읽어들인다
          sp.parse(new FileInputStream("student.xml"), sh);
     }
}
//핸들러 클래스
class SampleHandler05 extends DefaultHandler {
     //문자열을 준비한다
     StringBuffer sb = new StringBuffer();
     //문서의 시작
     public void startDocument() {
          sb.append
          ("<?xml version=\"1.0\" encoding=\"EUC-KR\" ?>");
          sb.append("<초등학생>");
     }
     //문서의 종료
     public void endDocument() {
          sb.append("</초등학생>");
          //문자열을 써넣는다
          try{
               PrintWriter pw = new PrintWriter
                          (new BufferedWriter(new FileWriter("result05.xml")));
               pw.println(sb);
               pw.close();
          }catch(Exception e){} 
     }
     //요소의 시작
     public void startElement(String namespaceURI, String localName,
                                        String qName, Attributes attrs) {
          if(qName.equals("이름")) {
               for(int i=0; i<attrs.getLength(); i++) {
                    sb.append("<" + attrs.getQName(i) + ">");
                    sb.append(attrs.getValue(i));
                    sb.append("</" + attrs.getQName(i) + ">");
               }
          }
     }
}


출처 : e-campus 강좌 중에서