# **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가 매우 유용하다!**