Files
java-examples/docs/XML SAX Parser.md

6.3 KiB

XML SAX Parser 쉽게 배우기

1. SAX Parser란?

SAX(Simple API for XML) Parser는 XML 문서를 한 줄씩 읽으며 이벤트 기반으로 처리하는 방식이다.

장점:

  • XML 문서를 메모리에 전부 로드하지 않음 → 메모리 효율적
  • 빠르게 읽기 가능

단점:

  • 문서 내 특정 요소를 수정하거나 추가하기 어려움
  • XML을 트리 형태로 다루지 않음 → 앞에서 읽은 데이터 유지 불가

➡ 적절한 사용 사례:

  • 대용량 XML 파일을 빠르게 읽을 때
  • 읽기 전용(XML을 수정할 필요가 없는 경우)

2. 주요 메서드 정리

메서드 설명
SAXParserFactory.newInstance() SAXParserFactory 객체 생성
SAXParserFactory.setNamespaceAware(true) 네임스페이스 인식 설정
SAXParserFactory.setValidating(true) XML 유효성 검사 설정
SAXParserFactory.newSAXParser() SAXParser 객체 생성
SAXParser.parse(File file, DefaultHandler handler) XML 파일을 읽고 핸들러로 전달
DefaultHandler.startDocument() 문서의 시작을 처리
DefaultHandler.endDocument() 문서의 끝을 처리
DefaultHandler.startElement(String uri, String localName, String qName, Attributes attributes) 요소의 시작을 처리
DefaultHandler.endElement(String uri, String localName, String qName) 요소의 끝을 처리
DefaultHandler.characters(char[] ch, int start, int length) 요소의 텍스트 데이터를 처리

3. XML 문서 예제

아래 XML 문서를 이용하여 SAX Parser를 적용해 보자.

<books>
    <book id="1">
        <title>자바 프로그래밍</title>
        <author>홍길동</author>
        <price>30000</price>
    </book>
    <book id="2">
        <title>데이터베이스 개론</title>
        <author>이몽룡</author>
        <price>25000</price>
    </book>
</books>

4. SAX Parser로 XML 읽기

✔ SAX Parser를 사용하여 XML 데이터 출력하기

아래 코드는 SAXParser를 사용하여 XML 파일을 읽고, 책 정보를 출력하는 예제이다.

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

import javax.xml.parsers.*;
import java.io.File;

public class SAXParserExample {
    public static void main(String[] args) {
        try {
            // 1. SAXParserFactory 생성
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

            // 2. 핸들러 설정
            DefaultHandler handler = new DefaultHandler() {
                boolean isTitle = false;
                boolean isAuthor = false;
                boolean isPrice = false;

                // 문서의 시작
                public void startDocument() {
                    System.out.println("XML 파싱 시작");
                }

                // 문서의 끝
                public void endDocument() {
                    System.out.println("XML 파싱 종료");
                }

                // 요소의 시작 태그
                public void startElement(String uri, String localName, String qName, Attributes attributes) {
                    if (qName.equalsIgnoreCase("book")) {
                        System.out.println("\n책 ID: " + attributes.getValue("id"));
                    } else if (qName.equalsIgnoreCase("title")) {
                        isTitle = true;
                    } else if (qName.equalsIgnoreCase("author")) {
                        isAuthor = true;
                    } else if (qName.equalsIgnoreCase("price")) {
                        isPrice = true;
                    }
                }

                // 요소의 끝 태그
                public void endElement(String uri, String localName, String qName) {
                    if (qName.equalsIgnoreCase("title")) {
                        isTitle = false;
                    } else if (qName.equalsIgnoreCase("author")) {
                        isAuthor = false;
                    } else if (qName.equalsIgnoreCase("price")) {
                        isPrice = false;
                    }
                }

                // 요소 안의 텍스트 처리
                public void characters(char[] ch, int start, int length) {
                    String text = new String(ch, start, length).trim();
                    if (!text.isEmpty()) {
                        if (isTitle) {
                            System.out.println("제목: " + text);
                        } else if (isAuthor) {
                            System.out.println("저자: " + text);
                        } else if (isPrice) {
                            System.out.println("가격: " + text);
                        }
                    }
                }
            };

            // 3. XML 파일 파싱
            File xmlFile = new File("books.xml");
            saxParser.parse(xmlFile, handler);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

🔹 실행 결과

XML 파싱 시작

책 ID: 1
제목: 자바 프로그래밍
저자: 홍길동
가격: 30000

책 ID: 2
제목: 데이터베이스 개론
저자: 이몽룡
가격: 25000

XML 파싱 종료

startElement()에서 태그 시작을 감지
characters()에서 태그 안의 텍스트를 처리
endElement()에서 태그 종료를 감지


5. SAX vs DOM 비교

특징 SAX Parser DOM Parser
메모리 사용량 적음 많음
속도 빠름 (한 줄씩 읽음) 느림 (전체 로드)
트리 구조 지원
수정 가능 여부 (읽기 전용)
사용 사례 대용량 XML 읽기 XML을 수정할 때

DOM Parser는 XML을 객체처럼 다루는 데 유리
SAX Parser는 대용량 XML을 읽기만 할 때 유리


6. 정리

SAX Parser는 이벤트 기반으로 XML을 한 줄씩 읽으며 처리
startElement()characters()를 이용해 데이터를 가져올 수 있음
대용량 XML을 처리할 때 유용하지만, 수정 기능이 없음
DOM Parser와의 차이를 이해하고 적절한 방식 선택

읽기 전용 & 성능이 중요한 경우 SAX Parser를 사용하자!