본문 바로가기

Java Programming/Java

JAXBContext로 xml을 오브젝트로, 오브젝트를 xml로 변환하기

xml을 보다 편리하게 컨트롤할수 있는 방법을 엊그제 알았습니다. ㅜㅜ

Java6부터(?? )기본 기능으로 들어가 있더군요.

요즘 xml을 사용하게 되어서 이것저것 알아보다 찾았습니다.


JAXBContext을 사용하면 정말 편하더군요.

xml을 읽어서 오브젝트로 바로 변환해주고 또한, 오브젝트에 있는 내용을 그대로 xml로 변환도 됩니다.

xml파서로 읽어서 오브젝트에 설정하는(set메소드에 일일이 저장하는)작업이 없어집니다.


여기저기 샘플을 찾아보면 많은데.... 대부분 단순한 샘플들 밖에 없더군요.

솔직히 복잡해지면 설명두 어렵구 소스도 늘어나서 그런것 같습니다.

저두 해보니 xml이 복잡해지면 소스가 막 늘어납니다.

설명하기도 힘들구요.

이걸 올릴까 말까 망설이기도 했습니다.

왜냐면 설명하기가 힘들어서요.^^;;


그래서 설명 별로 없습니다. 소스위주로 보세요. ^^ㅋ

마샬링 방법(오브젝트 -> xml)

JAXBContext jc = JAXBContext.newInstance({사용할오브젝트클래스});
    Marshaller marshaller = jc.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    marshaller.marshal(adressBook, {출력스트림});


언마샹링 방법(xml -> 오브젝트)

JAXBContext jc = JAXBContext.newInstance(사용할오브젝트클래스);
    Unmarshaller unMarshaller = jc.createUnmarshaller();
    {사용할오브젝트} {변수} = ({사용할오브젝트}) unMarshaller
				.unmarshal(new File({xml파일패스});


[샘플소스]이건 메인만....첨부파일 참조

import java.io.File;
import java.util.List;
 
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
 
public class JAXBSampleTest {
 
	/**
	 * @param args
	 * @throws JAXBException
	 */
	public static void main(String[] args) throws JAXBException {
		// TODO Auto-generated method stub
 
		JAXBContext jc = JAXBContext.newInstance(AddressBook.class);
 
		// Object -> xml
		marshall(jc);
		// xml -> Object
		unmarshall(jc);
 
	}
 
	private static void marshall(JAXBContext jc) throws JAXBException {
		// TODO Auto-generated method stub
 
		// 어드레스 정보를 생성
		AddressBook adressBook = createAddressBook();
 
		Marshaller marshaller = jc.createMarshaller();
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
		// AddressBooks.xml파일저장
		marshaller.marshal(adressBook, new File("./AddressBooks.xml"));
		// 콘솔 화면에 출력
		marshaller.marshal(adressBook, System.out);
	}
 
	private static AddressBook createAddressBook() {
		// TODO Auto-generated method stub
		AddressBook adressBook = new AddressBook();
 
		// 유저
		User user = new User();
		user.setName("Mr Kim");
		user.setPhone("12334344");
		user.setAddress("서욽특별시 서초구 양재동");
 
		// 여러메일 저장
		Emails emails = new Emails();
		// 메일1
		Email email = new Email();
		email.setId("Naver");
		email.setEmailAddr("abc@naver.com");
		emails.getEmail().add(email);
 
		// 메일2
		email = new Email();
		email.setId("Nate");
		email.setEmailAddr("abc@nate.com");
		emails.getEmail().add(email);
 
		// 메일3
		email = new Email();
		email.setId("Daum");
		email.setEmailAddr("abc@hanmail.net");
		emails.getEmail().add(email);
 
		// 유저에 메일정보 설정
		user.setEmails(emails);
 
		// 어드레스북에 유저 정보 설정
		adressBook.getUser().add(user);
 
		return adressBook;
	}
 
	private static void unmarshall(JAXBContext jc) throws JAXBException {
		// TODO Auto-generated method stub
		Unmarshaller unMarshaller = jc.createUnmarshaller();
		// AddressBooks.xml에서  어드레스 정보를 읽어들임.
		AddressBook adressBooks = (AddressBook) unMarshaller
				.unmarshal(new File("./AddressBooks.xml"));
 
		// 어드레스 정보에서 유저정보 취득
		List<User> users = (List<User>) adressBooks.getUser();
		for (User user : users) {
			System.out.println("**********************************");
			System.out.println("Name    : " + user.getName());
			System.out.println("Phone   : " + user.getPhone());
			System.out.println("Address : " + user.getAddress());
 
			List<Email> emails = (List<Email>) user.getEmails().getEmail();
			for (Email email : emails) {
				System.out.println("----------------------------");
				System.out.println("id        : "+ email.getId());
				System.out.println("emailAddr : "+ email.getEmailAddr());
			}
			System.out.println("**********************************");
		}
 
	}
 
}



[xml내용]

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addressBook>
    <user>
        <address>서욽특별시 서초구 양재동</address>
        <emails>
            <email id="Naver" emailAddr="abc@naver.com"/>
            <email id="Nate" emailAddr="abc@nate.com"/>
            <email id="Daum" emailAddr="abc@hanmail.net"/>
        </emails>
        <name>Mr Kim</name>
        <phone>12334344</phone>
    </user>
</addressBook>

위의 xml을 오브젝트로 만들면 아래와 같은 형식으로 오브젝트를 만듭니다.

AddressBook: User정보를 리스트로 갖고 있음.

User:name, phone, address, emails정보를 갖고 있음.

Emails : email정보를 리스트로 갖고 있음.

Email : id, emailAddr정보를 갖고 있음.



각 오브젝트의 get메소드에는 어노테이션이 붙어있습니다.

각 어노테이션의 역활은 아래와 같습니다.

@XmlRootElement

@XmlAttribute : 태그의 속성

@XmlElement : 태그


저도 어노테이션은 별로 사용해본적이 없어서 좀더 자세한 내용은 구글에게 물어보세요. ^^;


[실행결과]

JAXBTest.png 


위 결과 내용은 오브젝트를 xml로 만들어 만들어진 xml을 콘솔화면에 출력하고,

출력된 xml을 다시 읽어들여 언마샬링해서 오브젝트로 만든다음 오브젝트에 들어있는 내용을

출력하였습니다.


소스을 첨부합니다.

이클립스에서 import해서 한번 확인해보세요.

그리고 이거보단 더 쉽게 할 수 있으신 분이 계시면....공유좀.....^^ㅋ


감사합니다.


펌 : http://forum.falinux.com/zbxe/index.php?document_srl=572226&mid=lecture_tip