반응형
출처: http://kr.blog.yahoo.com/kwon37xi/folder/3381246.html

Java와 XML 데이터 바인딩이란 XML 파일을 자바 객체로 바꾸는 것이다.(DOM 객체로 만든다는 의미가 아니다)


예를들어 다음과 같은 XML이 있을 때
<AddressBook>
   <Person>
      <Name>홍길동</Name>
      <Address>서울</Address>
      <Phone>02-123-4567</Phone>
   </Person>
</AddressBook>
  • 위와 같은 상황에서 AddressBook, Person, Name, Address, Phone이라는 클래스를 생성해주고
  • XML 데이터를 입력하면 최상위 요소인 AddressBook의 객체가 생성되는 것이다.
  • AddressBook의 객체를 ab라고 할 때 ab.getPerson()하면 Person의 객체를 얻게 된다.
  • Person객체를 person이라 할 때 person.getName()Name객체를 리턴하거나 혹은 직접적으로 문자열 "홍길동"을 리턴하는 식이다.

클래스 생성

클래서 생성은 XML의 제약 집합(DTD, XML Schemas)로부터 자바 클래스를(가능하다면 인터페이스를) 생성하는 과정이다. XML 제약집합을 자바 클래스 정의와 동일하게 간주하면 된다.

언마샬링(Unmarshalling)

언마샬링은 XML 문서를 자바 클래스의 인스턴스로 변환하는 것을 의미한다.

단순히 XML 문서를 얻고 그 문서를 데이터 바인딩 프레임워크가 제공하는 도구나 클래스 인스턴스에 전달한 후, XML문서에 해당하는 자바 객체를 구하면 된다. 이때 생성된 자바 객체는 일반적으로 문서를 나타내는 최상의 부모 클래스의 인스턴스이다.

마샬링(Marshalling)

마샬링은 자바 객체와 이 객체에 종속적인 객체를 XML 형태로 변환하는 과정이다.

Castor

  • http://castor.exolab.org
  • 오픈 소스 XML 데이타 바인딩 프레임워크
  • Xerces 와 castor-버전-xml.jar 가 필요하다.

바잉딩 클래스 생성하기

  • XML Schemas 를 작성한다.
  • 다음을 실행하면 스키마에 따라 -package에 지정된 패키지로 클래스들이 생성된다.

    java org.exolab.castor.builder.SourceGenerator -i catalog.xsd -package javaxml2.castor
    

Unmarshall

File catalogFile = new File("catalog.xml");
InputSource is = new InputSource(new FileInputStream(catalogFile));

// Root 요소 클래스와 InputSource를 인자로 넘겨서 Unmarshalling을 수행한다.
Catalog catalog = (Catalog)Unmarshaller.unmarshal(Catalog.class, is);
  • InputSource 대신 Reader를 사용해도 되지만 문자 인코딩 문제가 발생할 수 있으므로 InputSource가 나은 것 같다.

Marshalling


// 변경된 카탈로그를 다시 파일에 저장한다.
FileWriter writer = new FileWriter(catalogFile);

Marshaller marshal = new Marshaller(writer);
marshal.setEncoding("euc-kr");
marshal.marshal(catalog);
  • 저기서 XML의 문자 인코딩을 지정했는데, 이것은 Writer의 인코딩과 일치해야 한다. 여기서는 운영체제 문자 인코딩이 EUC-KR 이다.
  • 다음 과 같이 Marshaller의 객체를 생성하지 않고 static 메소드로 해도 된다. 하지만 이럴 경우 운영체제의 문자 인코딩이 UTF-8이 아니라면 문자 인코딩 문제가 발생할 수 있다. 이 경우에 Writer의 인코딩을 UTF-8로 맞춰야 한다.

    Marshaller.marshal(catalog, writer);
  • + Recent posts