티스토리 뷰

728x90
반응형
SAX Parser 
: Simple API for XML Parser 의 약어로 , 자바 API에서 제공한다.
정의 : 기본적으로 SAX 파서는 문서를 순회하며 event가 발생하면서 순차적으로 파싱을 하게 된다.
SAX는 XML 문서를 읽어들여서 어떤 태그를 만나면 그에 따라 이벤트를 생성한다.

 

SAX에는 기본적으로 세가지 이벤트가 발생한다
  1. startElement() : 태그를 처음 만나면, 발생하는 이벤트
  2. endElement() : 닫힌 태그를 만나면 발생하는 이벤트
  3. characters() : 태그와 태그 사이의 text(내용)을 처리하기 위한 이벤트

 

예시 코드)

xml 파일
<?xml version="1.0" encoding="UTF-8"?><People>
<person>
        <age>30</age>
        <name>홍길동</name>
        <gender>Male</gender>
        <role>사용자</role>
</person>
<person>
        <age>30</age>
        <name>홍길이</name>
        <gender>Male</gender>
        <role>사용자2</role>
</person>
<person>
        <age>21</age>
        <name>홍삼이</name>
        <gender>Female</gender>
        <role>사용자3</role>
</person>
</People>
객체로 파싱할 클래스
public class Person {
        private int age;
        private String name;
        private String gender;
        private String role;
 
        @Override
        public String toString() {
                return "이름:"+name+" 나이:"+age+" 성별:"+gender+" 직책:"+role+"\n";
        }}
        
}

 

SAX 파싱하기 
파싱을 하기 위한 단계로는 DefaultHandler를 상속받는 Handler 클래스를 작성해야한다.
import java.util.ArrayList;import java.util.List;


import org.xml.sax.Attributes;import org.xml.sax.helpers.DefaultHandler;


public class PeopleSaxHandler extends DefaultHandler{
        
        //파싱한 사람객체를 넣을 리스트
        private List<Person> personList;
        //파싱한 사람 객체
        private Person person;
        //character 메소드에서 저장할 문자열 변수
        private String str;
        
        public PeopleSaxHandler() {
                personList = new ArrayList<>();
        }
        
        public void startElement(String uri, String localName, String name, Attributes att) {
                int attrCount = attr.getLength(); // 태그 개수
                                String attrName = attr.getQName(0); //첫번째 태그 명
                                String attrValue = attr.getValue(attrName) // 해당 태그 값
                                

                //시작 태그를 만났을 때 발생하는 이벤트
                if(name.equals("person")) {
                        person = new Person();
                        personList.add(person);
                }
        }
        //끝 태그를 만났을 때,
        public void endElement(String uri, String localName, String name) {
                if(name.equals("age")) {
                        person.setAge(Integer.parseInt(str));
                }else if(name.equals("name")) {
                        person.setName(str);
                }else if(name.equals("gender")) {
                        person.setGender(str);
                }else if(name.equals("role")) {
                        person.setRole(str);
                }
        }
        
        //각 element의 값(인식된 문자의 각 세그먼트에 대해서 호출
        public void characters(char[] ch, int start, int length) {
                //태그와 태그 사이의 내용을 처리
                str = new String(ch,start,length);
        }
        public List<Person> getPersonList(){
                return personList;
        }
        public void setPersonList(List<Person> personList) {
                this.personList=personList;
        }}
        
        ....
}

 

SAX 실행 코드
import java.io.File;import java.util.List;
import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;

public class PersonSaxTest {
        public static void main(String[] args) {
                File file = new File("./src/xml/people.xml");
                SAXParserFactory factory = SAXParserFactory.newInstance();
                
                try {
                        SAXParser parser = factory.newSAXParser();
                        PeopleSaxHandler handler = new PeopleSaxHandler();
                        parser.parse(file, handler);
                        
                        List<Person> list = handler.getPersonList();
                        
                        for(Person p:list) {
                                System.out.println(p);
                        }
                }catch(Exception e) {
                        e.printStackTrace();
                }        
        }
 }

 

결과 : 

이름: 홍길동 나이: 30 성별: Male 직책: 사용자1

이름: 홍길이 나이: 30 성별: Male 직책: 사용자2

이름: 홍삼이 나이: 21 성별: Female 직책: 사용자3

728x90
반응형
250x250
반응형
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함