add user agent parser and update build configuration
This commit is contained in:
187
docs/XML SAX Parser.md
Normal file
187
docs/XML SAX Parser.md
Normal file
@@ -0,0 +1,187 @@
|
||||
# **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
|
||||
<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 파일을 읽고, 책 정보를 출력하는 예제이다.
|
||||
|
||||
```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를 사용하자!**
|
||||
Reference in New Issue
Block a user