<Java> SAX parser (XML Parsing)

Google 아니고 Joogle·2022년 7월 28일
0

web

목록 보기
4/7

Java XML Parsing

  • 자바에서 XML을 파싱하는 방법으로 SAX Parser와 DOM Parser가 있음

SAX Parser

  • 문서를 읽다가 발생하는 이벤트 기반으로 문서 처리
  • 빠르고 한 번에 처리가 가능
  • 다양한 탐색이 어려움

DOM Parser

  • Document Object Model로 문서를 다 읽고 난 후 문서 구조 전체를 자료 구조에 저장하여 탐색하는 방식
  • 다양한 탐색이 가능하지만 느리고 무거우며 큰 문서를 처리하기 어려움
  • 태그들은 root노드를 시작으로 부모-자식 관계 구성

SAXParser e.g.

직원들의 사번, 이름, 봉급, 입사 날짜를 저장한 xml 파일이 있을 때, xml 파일에서 위와 같은 정보를 불러와 employee list에 저장하는 예시

1. xml File

  • 아래와 같은 형식의 xml 파일이 있을 때, 필요한 자료는 <emp> , </emp> 사이에 있는 부분이다
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE emp-list SYSTEM "emp-list.dtd">

<emp-list>
    <emp>
        <emp-id>111</emp-id>
        <emp-nm>홍길동</emp-nm>
        <salary>4000</salary>
        <enter-dt>2022-01-31</enter-dt>
    </emp>
    <emp>
        <emp-id>222</emp-id>
        <emp-nm>이길동</emp-nm>
        <salary>5000</salary>
        <enter-dt>2022-11-04</enter-dt>
    </emp>
    <emp>
        <emp-id>333</emp-id>
        <emp-nm>삼길동</emp-nm>
        <salary>6000</salary>
        <enter-dt>2022-02-15</enter-dt>
    </emp>
    <emp>
        <emp-id>444</emp-id>
        <emp-nm>사길동</emp-nm>
        <salary>7000</salary>
        <enter-dt>2022-07-22</enter-dt>
    </emp>
    <emp>
        <emp-id>555</emp-id>
        <emp-nm>오길동</emp-nm>
        <salary>8000</salary>
        <enter-dt>2022-05-11</enter-dt>
    </emp>
</emp-list>

2. class emp

  • 직원에 관한 class를 만들고 멤버 변수로는 xml 파일에 저장된 것과 동일하게 사번, 이름, 봉급, 입사 날짜가 있다
  • 이때 날짜를 저장하는 변수로는 LocalDate enterDt 사용
public class Emp {
	private String empId;
	private String empNm;
	private int salary;
	private LocalDate enterDt;
    ........ // getter, setter , toString 구현
    
 }

3. Handler

  • SAX를 파싱하기 위해서는 먼저 DefaultHandler를 상속받는 Handler 클래스를 작성

  • SAX에서는 기본적으로 세 가지 이벤트 발생

  • startElement () : 태그를 처음 만나면 발생하는 이벤트

  • endElement () : 닫힌 태그를 만나면 발생하는 이벤트

  • characters() : 태그와 태그 사이의 text를 처리하기 위한 이벤트

public class EmpListSaxHandler extends DefaultHandler {
	List<Emp> empList=new ArrayList<>();
	private Emp emp; 
	private String data;
	
	//시작 태그를 만나면 => emp 객체를 
	@Override
    public void startElement (String uri, String localName,
                              String qName, Attributes attributes) throws SAXException {
       
		if (qName.equals("emp")) {
			emp=new Emp();
		}
    }
	
	//end 태그를 만나면 호출
	@Override
    public void endElement (String uri, String localName, String qName) throws SAXException {
		
		switch (qName) {
		case "emp-id" : emp.setEmpId(data); break;
		case "emp-nm" :	emp.setEmpNm(data); break;
		case "salary" :	emp.setSalary(Integer.parseInt(data)); break;
		case "enter-dt" : emp.setEnterDt(LocalDate.parse(data)); break;
		case "emp" : empList.add(emp); break;
		}
    }
	
	//element를 만나면
	@Override
    public void characters (char ch[], int start, int length) throws SAXException {
		this.data=new String (ch, start, length);
    }
	
	public List<Emp> getEmpList() {
		return this.empList;
	}
}

4. Test Code

  • xml 파일을 불러오고 핸들러 객체를 만듦
  • xml 파일과 그 파일을 처리할 수 있는 Handler를 입력 받아 처리 (SAXParserFactory, SAXParser 사용)
public class Test {

	public static void main(String[] args) throws Exception {

		File file=new File("./src/io/xml/emp-list.xml");
		EmpListSaxHandler handler = new EmpListSaxHandler();
		

		SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
		SAXParser saxParser = saxParserFactory.newSAXParser();
		
		saxParser.parse(file, handler); 

		List<Emp> empList=handler.getEmpList();
		
		for (Emp emp : empList) {
			System.out.println(emp);
		}
	}
}

reference
https://sangwoo0727.github.io/java/JAVA-29_SAXParser/

profile
Backend 개발자 지망생

0개의 댓글