2011-01-07 5 views
3

シナリオ: 私は自分のシステムのオブジェクト構造を持っています。現在、Javaクラスにマップする必要のある複数のXMLソースがあります。 JavaオブジェクトをXMLに戻す必要はありません。Jakarta DigesterまたはJAXBを使用しますか?

DigesterまたはJAXBを使用するための私の提案は何ですか?現在、私はDigesterを使いたいと思っています。なぜなら、XMLソースごとに同じオブジェクトメソッド呼び出しに対してXMLパスを指定することができ、Digesterは維持しやすくなっているからです。 JAXBは、JavaとXMLのマーシャリング/アンマーシャリングに優れた設計をしていますが、複雑すぎると思いますが、xml-javaマッピングごとにxmlスキーマが必要です。

DigesterとJAXBのどちらも、使い方の異なるシナリオに合っていると思うので、そのうちの1つを決定する助けが必要です。どうもありがとう。

答えて

3

JAXBの利点は、複数の実装を持つ仕様(JSR-222)です:Metro,EclipseLink MOXyJaxMeです。これは、ベンダーロックインの問題を回避する。

の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

@Blaise:私は本当にXStreamが好きではありません。バグがあり、遅く、APIが醜いです。しかし、簡単なアプリケーションには便利です。 – skaffman

関連する問題