add user agent parser and update build configuration
This commit is contained in:
213
docs/XML DOM Parser.md
Normal file
213
docs/XML DOM Parser.md
Normal file
@@ -0,0 +1,213 @@
|
||||
# **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
|
||||
<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. 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")`으로 **모든 `<book>` 요소 가져오기**
|
||||
✅ `getAttribute("id")`로 **속성 값 읽기**
|
||||
✅ `getElementsByTagName("title").item(0).getTextContent()`로 **텍스트 값 가져오기**
|
||||
|
||||
---
|
||||
|
||||
## **5. XML 수정 (노드 추가, 수정, 삭제)**
|
||||
|
||||
### **✔ 새로운 `<book>` 요소 추가하기**
|
||||
|
||||
```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
|
||||
<books>
|
||||
<book id="1">
|
||||
<title>자바 프로그래밍</title>
|
||||
<author>홍길동</author>
|
||||
<price>30000</price>
|
||||
</book>
|
||||
<book id="2">
|
||||
<title>데이터베이스 개론</title>
|
||||
<author>이몽룡</author>
|
||||
<price>25000</price>
|
||||
</book>
|
||||
<book id="3">
|
||||
<title>네트워크 프로그래밍</title>
|
||||
<author>강감찬</author>
|
||||
<price>35000</price>
|
||||
</book>
|
||||
</books>
|
||||
```
|
||||
|
||||
✅ **새로운 `<book>` 요소를 추가하고 XML 파일을 업데이트**
|
||||
|
||||
---
|
||||
|
||||
## **6. 정리**
|
||||
✔ **DOM Parser는 XML을 메모리에 로드하여 트리 구조로 다룬다.**
|
||||
✔ `DocumentBuilder`를 사용해 XML을 `Document` 객체로 변환
|
||||
✔ `getElementsByTagName()`으로 특정 태그의 노드 가져오기
|
||||
✔ `appendChild()`로 새로운 노드 추가 가능
|
||||
✔ `Transformer`를 사용하여 변경 내용을 XML 파일로 저장
|
||||
|
||||
✅ **XML을 다룰 때, 읽기/수정/추가가 필요한 경우 DOM Parser가 매우 유용하다!**
|
||||
Reference in New Issue
Block a user