# **XML DOM Parser 쉽게 배우기**
## **1. XML DOM Parser란?**
DOM(Document Object Model) Parser는 XML 문서를 **트리 구조의 객체 모델**로 메모리에 로드하여 다루는 방식이다.
XML 데이터를 **읽고, 수정하고, 추가하고, 삭제**할 수 있다.
✔ **장점**:
- 문서를 **전체 로드**하므로 **빠른 검색 및 수정 가능**
- XML을 **객체처럼 다룰 수 있음**
✔ **단점**:
- **메모리 사용량이 큼** (큰 XML을 처리할 때 부담)
---
## **2. 주요 메서드 정리**
| 메서드 | 설명 |
|-----|----|
| `DocumentBuilderFactory.newInstance()` | `DocumentBuilderFactory` 객체 생성 |
| `DocumentBuilderFactory.setNamespaceAware(true)` | 네임스페이스를 인식하도록 설정 |
| `DocumentBuilderFactory.setIgnoringElementContentWhitespace(true)` | 공백 무시 |
| `DocumentBuilder.newDocumentBuilder()` | `DocumentBuilder` 객체 생성 |
| `DocumentBuilder.parse(File file)` | XML 파일을 `Document` 객체로 변환 |
| `Document.getDocumentElement()` | XML의 루트 요소 가져오기 |
| `Document.getElementsByTagName(String tag)` | 특정 태그 이름으로 요소 리스트 가져오기 |
| `Node.getNodeName()` | 노드의 이름 반환 |
| `Node.getTextContent()` | 노드의 텍스트 내용 반환 |
| `Node.getAttributes()` | 노드의 속성 반환 |
| `Element.getAttribute(String name)` | 특정 속성 값 가져오기 |
| `Element.setAttribute(String name, String value)` | 속성 추가 또는 변경 |
| `Element.appendChild(Node node)` | 하위 노드 추가 |
| `NodeList.getLength()` | `NodeList`의 크기 반환 |
| `NodeList.item(int index)` | `NodeList`에서 특정 인덱스의 노드 반환 |
| `TransformerFactory.newInstance()` | `TransformerFactory` 객체 생성 |
| `TransformerFactory.newTransformer()` | `Transformer` 객체 생성 |
| `Transformer.transform(Source, Result)` | XML을 파일 또는 콘솔에 출력 |
---
## **3. XML 문서 예제**
아래 XML을 사용하여 실습해보자.
```xml
자바 프로그래밍
홍길동
30000
데이터베이스 개론
이몽룡
25000
```
---
## **4. XML 읽기 (Parsing)**
### **✔ XML을 읽어서 출력하기**
아래 코드는 XML을 `Document` 객체로 로드하고, `NodeList`를 이용하여 책 정보를 출력한다.
```java
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class XMLParserExample {
public static void main(String[] args) throws Exception {
// 1. XML 파일을 로드하여 Document 객체로 변환
File xmlFile = new File("books.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(xmlFile);
// 2. 루트 요소 가져오기
Element root = document.getDocumentElement();
System.out.println("루트 요소: " + root.getNodeName());
// 3. 모든 book 요소 가져오기
NodeList bookList = document.getElementsByTagName("book");
for (int i = 0; i < bookList.getLength(); i++) {
Node bookNode = bookList.item(i);
if (bookNode.getNodeType() == Node.ELEMENT_NODE) {
Element book = (Element) bookNode;
// 속성 값 가져오기
String id = book.getAttribute("id");
// 하위 요소 가져오기
String title = book.getElementsByTagName("title").item(0).getTextContent();
String author = book.getElementsByTagName("author").item(0).getTextContent();
String price = book.getElementsByTagName("price").item(0).getTextContent();
System.out.println("책 ID: " + id);
System.out.println("제목: " + title);
System.out.println("저자: " + author);
System.out.println("가격: " + price);
System.out.println("----");
}
}
}
}
```
**🔹 실행 결과**
```
루트 요소: books
책 ID: 1
제목: 자바 프로그래밍
저자: 홍길동
가격: 30000
----
책 ID: 2
제목: 데이터베이스 개론
저자: 이몽룡
가격: 25000
----
```
✅ `DocumentBuilder.parse(xmlFile)`로 XML을 **Document 객체로 변환**
✅ `getElementsByTagName("book")`으로 **모든 `` 요소 가져오기**
✅ `getAttribute("id")`로 **속성 값 읽기**
✅ `getElementsByTagName("title").item(0).getTextContent()`로 **텍스트 값 가져오기**
---
## **5. XML 수정 (노드 추가, 수정, 삭제)**
### **✔ 새로운 `` 요소 추가하기**
```java
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class XMLAddElementExample {
public static void main(String[] args) throws Exception {
File xmlFile = new File("books.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(xmlFile);
Element root = document.getDocumentElement();
// 새로운 book 요소 생성
Element newBook = document.createElement("book");
newBook.setAttribute("id", "3");
Element title = document.createElement("title");
title.setTextContent("네트워크 프로그래밍");
Element author = document.createElement("author");
author.setTextContent("강감찬");
Element price = document.createElement("price");
price.setTextContent("35000");
// 새 book 요소에 자식 노드 추가
newBook.appendChild(title);
newBook.appendChild(author);
newBook.appendChild(price);
// 루트 노드에 새로운 book 추가
root.appendChild(newBook);
// 변경된 내용을 파일에 저장
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(document), new StreamResult(new File("books.xml")));
System.out.println("새로운 책 추가 완료!");
}
}
```
**🔹 실행 후 XML 파일 (`books.xml`)**
```xml
자바 프로그래밍
홍길동
30000
데이터베이스 개론
이몽룡
25000
네트워크 프로그래밍
강감찬
35000
```
✅ **새로운 `` 요소를 추가하고 XML 파일을 업데이트**
---
## **6. 정리**
✔ **DOM Parser는 XML을 메모리에 로드하여 트리 구조로 다룬다.**
✔ `DocumentBuilder`를 사용해 XML을 `Document` 객체로 변환
✔ `getElementsByTagName()`으로 특정 태그의 노드 가져오기
✔ `appendChild()`로 새로운 노드 추가 가능
✔ `Transformer`를 사용하여 변경 내용을 XML 파일로 저장
✅ **XML을 다룰 때, 읽기/수정/추가가 필요한 경우 DOM Parser가 매우 유용하다!**