Java XML ParsingSAX ParserDOM ParserDocument Object Model로 문서를 다 읽고 난 후 문서 구조 전체를 자료 구조에 저장하여 탐색하는 방식SAXParser e.g.직원들의 사번, 이름, 봉급, 입사 날짜를 저장한 xml 파일이 있을 때, xml 파일에서 위와 같은 정보를 불러와 employee list에 저장하는 예시
1. xml File<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 empLocalDate enterDt 사용public class Emp {
private String empId;
private String empNm;
private int salary;
private LocalDate enterDt;
........ // getter, setter , toString 구현
}
3. HandlerSAX를 파싱하기 위해서는 먼저 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 Codepublic 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/