25. 자바와 XML 처리
XML(Extensible Markup Language)은 데이터 저장과 전송에 매우 유용한 형식으로, 다양한 분야에서 사용되고 있습니다. 자바에서 XML을 처리하기 위해서는 다양한 방법이 제공됩니다.
25.1. XML 개요
XML은 계층적인 구조를 가지고 있으며, 태그와 속성을 사용하여 데이터를 기술합니다. 데이터는 자유롭게 정의될 수 있기 때문에 많은 분야에서 사용되고 있습니다.
25.2. DOM 파싱
DOM(Document Object Model)은 XML 문서를 메모리에 트리 구조로 저장하는 방법입니다. 메모리에 로딩된 XML 문서를 수정하거나 탐색하는데 용이합니다. 하지만 대용량의 XML 파일을 처리할 경우 메모리 부담이 크기 때문에 성능 문제가 발생할 수 있습니다.
아래는 DOM 파싱을 사용하여 XML 파일에서 데이터를 읽어오는 예제입니다.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("example.xml"));
Element root = document.getDocumentElement();
NodeList nodeList = root.getElementsByTagName("book");
for(int i=0; i<nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if(node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element)node;
String title = element.getElementsByTagName("title").item(0).getTextContent();
String author = element.getElementsByTagName("author").item(0).getTextContent();
String year = element.getElementsByTagName("year").item(0).getTextContent();
System.out.println(title + " - " + author + " (" + year + ")");
}
}
25.3. SAX 파싱
SAX(Simple API for XML)는 XML 문서를 한 줄씩 읽어와 이벤트를 발생시키는 방법입니다. 메모리를 적게 사용하고 처리 속도가 빠르지만, XML 파일을 수정하는 등의 작업이 어렵습니다.
아래는 SAX 파싱을 사용하여 XML 파일에서 데이터를 읽어오는 예제입니다.
SAXParser parser = factory.newSAXParser();
DefaultHandler handler = new DefaultHandler() {
boolean btitle = false;
boolean bauthor = false;
boolean byear = false;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equalsIgnoreCase("title")) {
btitle = true;
}
if(qName.equalsIgnoreCase("author")) {
bauthor = true;
}
if(qName.equalsIgnoreCase("year")) {
byear = true;
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {}
public void characters(char ch[], int start, int length) throws SAXException {
if(btitle) {
System.out.println("Title: " + new String(ch, start, length));
btitle = false;
}
if(bauthor) {
System.out.println("Author: " + new String(ch, start, length));
bauthor = false;
}
if(byear) {
System.out.println("Year: " + new String(ch, start, length));
byear = false;
}
}
}
25.4. JAXB 사용
Java Architecture for XML Binding (JAXB)는 XML과 자바 클래스 간의 매핑을 지원하는 라이브러리입니다. JAXB는 XML 스키마에 기반하여 자바 클래스를 생성하거나, 이미 작성된 자바 클래스에 대해 XML 스키마를 생성할 수 있습니다. 이렇게 생성된 자바 클래스와 XML 문서를 서로 매핑하여, 자바 객체와 XML 문서 간의 변환을 쉽게 할 수 있습니다.
JAXB를 사용하기 위해서는 JAXB API와 JAXB 구현체인 JAXB RI(JAXB Reference Implementation)을 다운로드하고 클래스패스에 추가해야 합니다. 또한, JAXB에서 사용할 XML 스키마 파일을 준비해야 합니다.
다음은 JAXB를 사용하여 XML 문서를 자바 객체로 변환하는 간단한 예제 코드입니다.
// JAXBContext 생성
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
// Unmarshaller 생성
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// XML 문서 로드
File xmlFile = new File("person.xml");
Person person = (Person) unmarshaller.unmarshal(xmlFile);
// 변환된 자바 객체 사용
System.out.println(person.getName());
System.out.println(person.getAge());
위의 코드에서 Person 클래스는 JAXB에서 생성된 클래스로, XML 문서와 매핑됩니다. JAXBContext는 JAXB에서 제공하는 클래스로, Person 클래스를 생성하는 데 사용됩니다. Unmarshaller는 XML 문서를 자바 객체로 변환하는 데 사용되며, unmarshal() 메서드를 호출하여 XML 문서를 Person 객체로 변환합니다.
반대로, 자바 객체를 XML 문서로 변환하는 경우에는 다음과 같이 코드를 작성할 수 있습니다.
// JAXBContext 생성
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
// Marshaller 생성
Marshaller marshaller = jaxbContext.createMarshaller();
// 변환할 자바 객체 생성
Person person = new Person();
person.setName("John Doe");
person.setAge(30);
// XML 문서로 변환
marshaller.marshal(person, System.out);
위의 코드에서 Marshaller는 자바 객체를 XML 문서로 변환하는 데 사용되며, marshal() 메소드를 호출하여 Person 객체를 XML 문서로 변환합니다. 이때, 변환된 XML 문서는 System.out에 출력됩니다.
이처럼 JAXB를 사용하면, XML 문서와 자바 객체 간의 변환 작업을 쉽게 처리할 수 있습니다.
'GD's IT Lectures : 기초부터 시리즈 > 자바(JAVA) 기초부터 ~' 카테고리의 다른 글
[자바(JAVA)] 자바 서블릿 (0) | 2023.04.30 |
---|---|
[자바(JAVA)] 자바와 웹 프로그래밍 (0) | 2023.04.30 |
[자바(JAVA)] 자바 네이티브 인터페이스 (JNI) (0) | 2023.04.28 |
[자바(JAVA)] 메모리 관리와 가비지 컬렉션 (0) | 2023.04.28 |
[자바(JAVA)] 자바 어노테이션 (0) | 2023.04.28 |
댓글