텔레메트릭스 어쩌구 하면서 IEEE1451 TEDS Tool을 작업하면서 XML로 TEDS 데이터를 관리한적이 있었다.

그당시 JDOM(??)을 사용했을듯 한데.. 하튼.. 아무 생각없이 좀 무식하게 만들감이 있어.. XML to Object 를 찾다가 발견한넘이 JAXB(Java Architecture for XML Binding)다. 생각보다 요넘 많이 유용한듯..

문서를 찾다보니.. 예외 처리 시 어쩌구 저쩌구 하지만.. 그 방법은 다음으로 미루고.. 초기 프로토타입 버전을 올림(난중에 얼마나 무식했었는지 참고용ㅋㅋ)

Example
package jface.common.xmlbind;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.UnmarshallerHandler;

import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import jface.common.coolbar.marshalling.Coolbar;

public class XmlBinding {

 

 /**
  * unmarshalling
  *
  * XML to java 데이터 객체
  *
  * @param path
  *    .xml 경로
  * @return
  *    언마샬된 데이터 객체
  */
 public Coolbar getCoolBarMenu(String path) {
 
  try {
   ClassLoader cl = this.getClass().getClassLoader();
   JAXBContext context   = JAXBContext.newInstance(Coolbar.class); 
   Unmarshaller unmarshaller  = context.createUnmarshaller();
  
   // Unmarshaller에서 저수준 처리기를 얻는다.
   UnmarshallerHandler unmarshallerHandler = unmarshaller.getUnmarshallerHandler();

   // SAX 파서를 얻기 위해 JAXP를 사용한다.
   SAXParserFactory factory = SAXParserFactory.newInstance();

   // factory 옵션을 설정한 다음, 표준 JAXP 호출을 사용한다.
   factory.setNamespaceAware(true);

  
   XMLReader reader = factory.newSAXParser().getXMLReader();

   // unmarshallerHandler로 reader 처리기를 설정한다.
   reader.setContentHandler(unmarshallerHandler);

   // 이제 JAXB에서 가져온 언마샬링 처리기를 사용해 구문분석에 들어간다.
   reader.parse(new InputSource(cl.getResourceAsStream(path)));
  
   Coolbar instance = (Coolbar)unmarshallerHandler.getResult();

   return instance;
  } catch(Exception e) {
   e.printStackTrace();
   return null;
  }

 }
 
 /**
  * marshalling
  *
  * java object to XML
  * @param path
  *     .xml 경로
  * @param coolbar
  *     java 데이터 객체
  */
 public void setCoolBarMenu(String path, Coolbar coolbar) {
  try {
   ClassLoader cl = this.getClass().getClassLoader();
   JAXBContext jc = JAXBContext.newInstance(Coolbar.class);
  
         Marshaller   m  = jc.createMarshaller();
         m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT,  Boolean.TRUE );

         OutputStream  os  = new FileOutputStream( new File(cl.getResource(path).getPath()) );

         m.marshal( coolbar, os );


  } catch(Exception e) {
  }
 }
}

ps.
    - XML to Java Class 를 이클립스 plug in 으로 만들어 보는게 좋을듯.. 공부도 할겸. (이런거는 좀 미루지 말자.)


'java > xml' 카테고리의 다른 글

[xml] - xjc.exe 를 사용한 xsd to java class 생성  (0) 2010.06.29
[xml] - xml to xsd  (0) 2010.06.29
[java] - Marshaller 을 이용한 Object to xml string  (0) 2010.06.25
Posted by 짱가쟁이

클래스에 @XmlRootElement annotation을 사용하지 않은 obejct를 마샬링할 때 사용하면 유용할듯.


public String getMarshallingString(Object obj, String uri, String rootElement) throws Exception {
    JAXBContext jaxbContext;
    StringWriter st = new StringWriter();
    try {
        jaxbContext = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = jaxbContext.createMarshaller();
        marshaller.marshal(new JAXBElement(
                  new QName("http://map.star", obj.getClass().getSimpleName()), obj.getClass(), obj ), st);

        return XMLPrinter.prettyFormat(st.toString());
    } catch(Exception e) {
        e.printStackTrace();
        throw e;
    }
}

'java > xml' 카테고리의 다른 글

[JAXB] - unmarshalling, marshalling  (0) 2010.06.29
[xml] - xjc.exe 를 사용한 xsd to java class 생성  (0) 2010.06.29
[xml] - xml to xsd  (0) 2010.06.29
Posted by 짱가쟁이
이전버튼 1 이전버튼