티스토리 뷰
728x90
반응형
SAX Parser
: Simple API for XML Parser 의 약어로 , 자바 API에서 제공한다.
정의 : 기본적으로 SAX 파서는 문서를 순회하며 event가 발생하면서 순차적으로 파싱을 하게 된다.
SAX는 XML 문서를 읽어들여서 어떤 태그를 만나면 그에 따라 이벤트를 생성한다.
SAX에는 기본적으로 세가지 이벤트가 발생한다
-
startElement() : 태그를 처음 만나면, 발생하는 이벤트
-
endElement() : 닫힌 태그를 만나면 발생하는 이벤트
-
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
반응형
'프로그램 언어 > JAVA' 카테고리의 다른 글
자바(java) stream Map 그룹만들기 ,내림차순 정렬 , 더하기 (0) | 2023.05.02 |
---|---|
자바(java) 얕은 복사와 깊은 복사의 차이(경험담..) (0) | 2023.05.02 |
클라이언트 실제 접속 IP 가져오는 방법 (0) | 2023.05.02 |
java 엑셀 파일 읽기 대용량 문제 처리 방법 part2 (1) | 2023.05.02 |
java 엑셀 파일 읽기 기능 part1 (0) | 2023.05.02 |
250x250
반응형
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Quartz
- 정의
- spring
- 도커
- hazelcast
- 스케줄러
- mybatis
- LocalDate
- 이미지
- 권한
- dfs
- MySQL
- centos7
- 캘린더
- 격리수준
- Java
- 개념 이해하기
- 캐시
- dockerfile
- docker
- ncp
- Cache
- insert
- 리눅스
- 컨테이너
- 네이버 클라우드
- Lock
- leatcode
- 알고리즘
- Linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함