블로그 이미지
올해목표 // 10월 어학연수 떠나자~ 자수씨

카테고리

전체글 (1457)
Brand New! (28)
주절주절 (213)
MOT (11)
해외쇼핑 (49)
쇼핑노트 (150)
취미생활 (94)
iPhone (4)
Eclipse (121)
Google (83)
Spring (31)
JAVA (176)
Ant (2)
Maven (29)
iBATIS (7)
Regular Expression (6)
Java Web Start (4)
WebServices (14)
JAXB (12)
CAS (13)
JBoss Seam (6)
OSGi (1)
Hibernate (2)
James (6)
Alfresco (17)
JavaScript (59)
WEB (49)
Database (20)
OS (26)
Tools (8)
Tips (26)
IT정보 (1)
Book (21)
Programming (37)
외부행사 (43)
주변인들 (17)
여행노트 (60)
학교생활 (30)
회사생활 (52)
사회생활 (5)
외국어공부 (12)
잡동사니 (30)
Total
Today
Yesterday
 
11-16 13:37
 

달력

« » 2024.11
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
 

최근에 올라온 글

최근에 달린 댓글


JAXB를 통해 XML을 생성하게 되면 아래와 같은 헤더가 자동적으로 생성됩니다.

<?xml version="1.0" encoding="EUC-KR" standalone="yes"?>

위의 헤더 외에 DTD를 지정해야 한다면, 그리고 standalone="yes" 속성을 제거해야 할 경우가 생겨서 수 많은 검색 끝에 해결책을 찾아냈습니다.


Marshaller marshaller = JAXBContext.newInstance(XXX.class).createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "EUC-KR");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);

...

StringWriter writer = new StringWriter();
writer.append("<?xml version=\"1.0\" encoding=\"EUC-KR\"?>\r\n");
marshaller.get().marshal(xxx, writer);

JAXB_FRAGMENT 를 true 로 설정하면 상단의 헤더를 제외하게 됩니다. 마샬링을 하게 되는 Writer 객체에 사용할 헤더를 append 시키는 것으로 처리할 수 있습니다.


마샬러에 프로퍼티를 설정하면 된다는 글도 있었는데, 잘 안되는 것 같아 위의 방식을 사용하였습니다.

Posted by 자수씨
, |


회사일을 하다가 불연듯 아이디어가 떠올라서 프로그램을 만들다 보니 XML 설정파일을 만들 일이 생겼습니다. JAXB 로 뚝딱뚝딱 만들고 xml 을 생성하다보니 무엇인가 아쉬움이 있었습니다.

"Code Assist 가 있었으면 좋겠는걸?"

처음에는 dtd 를 만들어볼까 했지만, 먼가 수작업이 많이 들어갈 것 같아 JAXB 문서를 참고해서 생성하였습니다.



위의 코드를 쉽게 설명하자면 Vicki 라는 클래스는 XmlRootElement 입니다. 관련된 클래스를 모두 context 에 설정하는 것이 아니라 XmlRootElement 만 설정하면 됩니다.

xml 형식은 언제든지 변하니 소스로 만들어 놓으면 쉽게 샥샥 처리될 듯 합니다.

참고사이트: http://jaxb.java.net/guide/Invoking_schemagen_programatically.html

Posted by 자수씨
, |


<!DOCTYPE pubdoc SYSTEM "pubdoc.dtd">

위와 같이 XML 에 dtd 가 정의되어 있는 경우 JAXB 로 unmarshal 을 할 경우 dtd 의 위치가 명확하지 않아 재대로 unmarshal 이 되지 않을 수 있습니다.

좀 더 안전한 시스템을 위해서는 명확하게 정의해야 하는데요... 아래와 같은 방법을 사용합니다.



XMLReader 객체에 설정된 EntityResolver 를 통해 해당 dtd 와 관련된 정보들을 InputSource 로 참조할 수 있도록 처리하는 것 입니다.

EntityResolver 의 resolveEntity 메소드는 필요로 하는 리소스들을 두번째 파라미터인 syustemId 로 넘기게 됩니다.

즉, "C:/JAVA/Temp" 폴더에서 실행을 한다면 "pubdoc.dtd" 는 "C:/JAVA/Temp/pubdoc.dtd" 에서 찾게 됩니다. 해당 systemId 를 적당히 잘라내어 클래스패스 내에 리소스의 위치와 결합시켜서 로드하는 방식을 사용하였습니다.


먼가 systemId 자르는 것이 찝찌름 하지만 정상구동 확인하였습니다.

Posted by 자수씨
, |

JAXB로 XML을 마셜링 할 때 사용하는 프로퍼티들 입니다.

사용법은 아래와 같습니다.

JAXBContext jaxbInstance = JAXBContext.newInstance(MapPoint.class);
marshaller = jaxbInstance.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);



프로퍼티들~ 마지막꺼는 해석이.. 잘 안되네요 ㅋㅋㅋ





Posted by 자수씨
, |

[JAXB] DTD -> JAXB Model

JAVA/JAXB / 2009. 7. 2. 12:41

XML 파서와 제너레이터를 만들어야 하는 일이 생겼습니다.
DTD는 있는데 이걸 가지고 JAXB 모델 클래스를 만들자니 귀찮고 해서 검색을 해 보았습니다.

다행히도 JAXB 문서 중에 JAXB- RI Extensions / DTD 가 있었습니다.

일단 xjc를 사용하기 위해 jaxb를 다운받고 인스톨을 한 후 bin 폴더에서 xjc.bat 를 이용하여 테스트를 해보았습니다.




xjc.bat -dtd exchange_v2.dtd

위의 명령을 실행하면 아래와 같은 결과가 제너레이트 됩니다.






위와 같이 하게되면 generated 라는 패키지로 생성이 됩니다. 간략한 옵션으로 원하는 패키지로도 생성할 수 있습니다.

xjc.bat -p kr.co.vicki.ex -dtd exchange_v2.dtd







Posted by 자수씨
, |

쉽게 Java Beans ↔ XML 처리를 할 수 있는 JAXB 라이브러리를 통해서 java.util.Map 의 구현체 (HashMap)을
XML 화 처리하려고 하였습니다.



원래 JAXB 는 JAX-WS 때문에 나온 거 같은데 요긴하게 잘 써먹고 있습니다.
자바랑 플렉스간의 연동시에도 JAXB 를 활용하면 좀더 편하게 처리를 할 수 있을 것 같아요 ㅋㅋㅋ

Posted by 자수씨
, |
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

출처: http://www.caucho.com/resin-3.1/doc/jaxb-annotations.xtp

@XmlElements
다중 @XmlElement를 정의할 때 사용
super class의 sub class 들을 따로 관리할 때 사용하면 용의할 것 같음

XML Document



@XmlElementWrapper
list 형식의 Element를 serialized 하기 위한 annotate

XML Document



@XmlJavaTypeAdapter
-_-;;;;;  설명하기에는 영어실력이 딸려서.. ㅠ_ㅠ
XmlAdapter를 이용해서 Java Type에 맞게 convert해주는 것을 정의하는 것 같음....

XML Document



@XmlRootElement
xml에서 최상위 노드를 annotate.
하지만 하위노드에서도 사용을 한다.. 이유는???

XML Document



@XmlTransient
unserialrizable을 mark.....
이걸 찾으려고 이 고생을... ㅠ_ㅠ XmlAccessorType.FIELD 로 해도 되는 거 였구나...
예제는 없습니다. ㅋㅋㅋ


@XmlValue
하나의 property나 field만 있을 경우 해당 property나 field에 serialized.

XML Document

Posted by 자수씨
, |
출처: http://www.caucho.com/resin-3.1/doc/jaxb-annotations.xtp

@XmlAccessorType
property의 serializability를 결정합니다.
@XmlAccessorType values
NONE@XmlElement로 annotate된 fileds와 properties 만 serialized.
FIELD모든 fileds을 serialized.
PROPERTY모든 properties을 serialized.
PUBLIC_MEMBERpublic fields와 properties를 serialized.
@XmlAccessorType 예제

XML Document



@XmlAttribute
field나 property가 attribute로 serialize 될 것인지를 mark.
@XmlAttribute 예제

XML Document



@XmlElement
field나 property가 element로 serialize 될 것인지를 mark.
@XmlAttribute 예제

XML Document

Posted by 자수씨
, |

[JAXB] JAXB란 무엇인가

JAVA/JAXB / 2008. 2. 22. 10:06
http://java.sun.com/developer/technicalArticles/WebServices/jaxb/index.html#introjb

이곳에 영어로 주저리 주저리 써놓았지만 한국인인지라 바로 와닫지 않는다.

그냥 단순하게 말하자면 xml로 되어 있는 데이터를 Java Object로 변환이 되고

Java Object가 xml 데이터로 변환이 되는 것으로 이해하는 편이 빠를 것 같다.

사용자 삽입 이미지



그림을 봐도 실제로 해보지 않으면 이해가 되지 않는다.

JAXB 에서는 xsd, dtd, xml 데이터를 통해 데이터를 넣을 Java Object를 생성해주는 xjc 라는 툴을

제공해주며 기존 Java Object를 xsd 를 생성해주는 schemagen 도 포함되어 있다.


JAX-WS 를 하기 위해서는 내부 기술을 이해하고 가야 할 것 같아서 시작해본 JAXB....

generator tool 들도 제공이 되기 때문에 손에만 익는다면 강력한 파워를 보여줄 것 같다...

eclipse 플러그인도 있던데... 그것도 사용해 봐야 할 것 같다~

Posted by 자수씨
, |

글 보관함

최근에 받은 트랙백