Java XML Parsing
SAX Parser
DOM Parser
Document 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 emp
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
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/