# **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를 적용해 보자. ```xml 자바 프로그래밍 홍길동 30000 데이터베이스 개론 이몽룡 25000 ``` --- ## **4. SAX Parser로 XML 읽기** ### **✔ SAX Parser를 사용하여 XML 데이터 출력하기** 아래 코드는 `SAXParser`를 사용하여 XML 파일을 읽고, 책 정보를 출력하는 예제이다. ```java 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를 사용하자!**