2011-01-07 6 views
3

주어진 시나리오 : 내 시스템의 개체 구조가 있습니다. 이제 Java 클래스에 매핑해야하는 XML 소스가 두 개 이상 있습니다. Java 객체를 다시 XML로 변환 할 필요가 없습니다.Jakarta Digester 또는 JAXB를 사용 하시겠습니까?

Digester 또는 JAXB를 사용하려면 어떻게 생각하세요? 현재는 Digester를 사용하려고합니다. 왜냐하면 XML 소스마다 동일한 객체 메소드 호출에 XML 경로를 지정할 수 있기 때문에 Digester를 유지 관리하기가 쉽습니다. JAXB가 자바와 XML을 마샬링/언 마샬링하는 데 좋은 설계를 가지고 있지만, 너무 복잡하다고 생각하지만 XML 스키마는 각 xml-Java 매핑에 필요합니다.

Digester 나 JAXB 모두 서로 다른 사용 시나리오에 맞는 임무가 있다고 생각합니다. 따라서 그 중 하나를 결정하는 데 도움이 필요합니다. 고마워.

답변

3

JAXB의 장점은 다중 구현 (Metro, EclipseLink MOXy, JaxMe)을 가진 spec (JSR-222)이라는 것입니다. 이에 벤더 종속의 문제를 피할 수 있습니다.

XPath에 기반 메핑 EclipseLink JAXB (MOXy)가 (필자는 기술 리드 해요) XPath에 기반 매핑을 지원하는 확장이

합니다.

package blog.geocode; 

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="kml") 
@XmlType(propOrder={"country", "state", "city", "street", "postalCode"}) 
public class Address { 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()") 
    private String street; 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()") 
    private String city; 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()") 
    private String state; 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()") 
    private String country; 

    @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()") 
    private String postalCode; 

} 

여러 XML 소스

는 MOXY의 XML 메타 데이터를 활용할 수있는 객체 모델에 여러 XML 표현을 적용합니다. 이것은 JAXB 표준의 또 다른 확장입니다. 자세한 내용은

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="blog.bindingfile"> 
    <xml-schema 
     namespace="http://www.example.com/customer" 
     element-form-default="QUALIFIED"/> 
    <java-types> 
     <java-type name="Customer"> 
      <xml-root-element/> 
      <xml-type prop-order="firstName lastName address phoneNumbers"/> 
      <java-attributes> 
       <xml-element java-attribute="firstName" name="first-name"/> 
       <xml-element java-attribute="lastName" name="last-name"/> 
       <xml-element java-attribute="phoneNumbers" name="phone-number"/> 
      </java-attributes> 
     </java-type> 
     <java-type name="PhoneNumber"> 
      <java-attributes> 
       <xml-attribute java-attribute="type"/> 
       <xml-value java-attribute="number"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 

: 예제 파일의 모양

+0

훌륭한 조언, 지금 당장 공부하러갑니다. – Matt

4

여러분은 JAXB의 왜곡 된 전망을 가지고 있을지도 모릅니다. 그것은 수 있습니다 당신이 그렇게하도록 선택하면 복잡하지만 또한 매우 간단 수 있습니다. 예를 들어, 하나의 주석 만 사용하여 전체 XML 문서를 객체 그래프에 바인딩 할 수 있습니다.

또한 스키마는 빨간색 청어입니다. JAXB 은 XML 스키마에서 Java 코드를 생성 할 수 있지만 스키마가있는 경우에 편리합니다. 그렇지 않으면 그 부분을 무시하십시오. 손으로 클래스 모델에 주석을 달 수 있습니다. 매우 쉽습니다.

Digester는 클래스 모델에 경로 표현을 추가해야하기 때문에 유지 관리하기가 더 어렵습니다.

+1

덕분에 많이, 나는 더 많은 시간을 할애해야한다고 생각 JAXB와 함께. – Matt

1

아마도 오프 주제 : 저는 xstream을 선호하여 소화조를 폐기했습니다. 아마도 봐봐

+1

체크 아웃 : http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html –

+0

좋은 작품. 이것은 분을 완료하는 것입니다. 코멘트 길이 ... – mtraut

+1

@Blise : 나는 XStream을 정말로 좋아하지 않는다. 버그가 있으며 느리고 API는 엉뚱한 편입니다. 그러나 사소한 응용 프로그램에 유용합니다. – skaffman

관련 문제