2009-06-20 11 views
17

Javaオブジェクト階層からXML文書を構築する必要があります。 JavaクラスとXMLフォーマットの両方が修正されています。だから私はXStreamのようなXMLシリアライザを使うことはできません:それはJavaクラスのXMLフォーマットに基づいています。同様に、JAXBのようなJava XMLバインディング技術は、XMLスキーマからJavaクラスを作成するため動作しません。私は手作業によるアプローチが必要です。JavaでXML文書を簡潔に構築するにはどうすればいいですか?

ローテクなStringBuilderのルートは、脆弱でバグの多いコードになります(私にとっては少なくとも!)。

JAXPJDOMなどのAPIは、はるかに堅牢なコードになりますが、これはかなり冗長です。

Groovyは、エレガントなMarkupBuilderを持っている:私はピュアJavaで滞在したいけれども

def writer = new StringWriter() 
def xml = new MarkupBuilder(writer) 
xml.records() { 
    car(name:'HSV Maloo', make:'Holden', year:2006) { 
    country('Australia') 
    record(type:'speed', 'Production Pickup Truck with speed of 271kph') 
    } 
    car(name:'P50', make:'Peel', year:1962) { 
    country('Isle of Man') 
    record(type:'size', 'Smallest Street-Legal Car at 99cm wide and 59 kg') 
    } 
} 

他の言語(例えばRuby)は、さらに良いものを持っています。 practicalxmlやJames Murtyのxmlbuilderのように、Java用の新しいXMLビルダーがいくつか存在するようです。

JavaでXML文書を構築するためのより洗練されたアプローチは何ですか?

概要:

ジョン・ドウがdom4jjdomを示唆しました。

とにかくJAXBを使用することをお勧めしました。これは有力な提案だったので、私は現在のJavaBeansとJAXB JavaBeansをマップするためにDozerを使用できます。

thaggieはJIBXを推奨し、CurtainDogとjhericoはバインディング技術が実際に実用的であることに同意します。

StaxManはStaxMateを推奨します。

私が見てきたことの中で、practicalxmlとJames Murtyのxmlbuilderは、最も簡潔なビルダーだと思われますが、かなり新しくなっています。 JAXBのようなバインディング技術は、余分な安全/自動化を提供するようです。主流の選択肢のうち、dom4jはまともなものですが、まだまだ冗長です。

public Document createDocument() { 
    Document document = DocumentHelper.createDocument(); 
    Element root = document.addElement("root"); 
    Element author2 = root.addElement("author") 
     .addAttribute("name", "Toby") 
     .addAttribute("location", "Germany") 
     .addText("Tobias Rademacher"); 
    Element author1 = root.addElement("author") 
     .addAttribute("name", "James") 
     .addAttribute("location", "UK") 
     .addText("James Strachan"); 
    return document; 
} 

は簡潔にするため、あなたは簡潔を提供するために、このAPIの上に薄いファサードをラップすることができます:それは私の好きな「流れるようなインターフェイス」(彼らは一緒に連鎖させることができますので、ミューテータが変異したオブジェクトへの参照を返します)を提供していますこれらのメソッドのいくつかの同義語(例えば、addAttribute()の代わりにattr()など)。

ありがとうございます!

P .: Stephan SchmidtがJavaを手がけたのはMarkupBuilderですが、公開していないようです。

+0

http://dom4j.sourceforge.net/へのdom4jリンクを修正してください:) –

+0

@PawelVeselov - dom4j.orgがどのようにしてcooptedされたかおかげさまです。 –

+0

(O/T)@JimFerrans私はそれがcooptedだとは思わない、彼らはもうdom4jソフトウェアはもう言及していない。それらとdom4jライブラリページの間のページスタイリングは、同じ屋根を持っていないそれらの人のためにあまりにも似ています:) –

答えて

8

dom4jまたはjdomがおそらく最もエレガントです。あなたが好きなようにコードを書くことができます。 Dom4jにはビルダーがありますが、コードはもっと冗長です。

Element.addElement("x").setAttribute("x", "y").xxxxx; 
+0

ありがとう、私はdom4jを考慮していない。 –

1

とにかくJAXBを使用しないと、問題は非常に単純なオブジェクトマッピングになり、xmlは完全に回避されます。

+0

XMLが固定標準(CableLabsのADI 1.1)であり、Javaクラスもあらかじめ定義されているXMLマッピングにオブジェクトを書き込む必要があります。 –

+0

JAXBを使用してJavaクラスをスキーマにマップし、Dozerを使用してJAXBクラスから事前定義されたJavaクラスにマップします。 – Jherico

+0

@Jherico:ありがとう、まだDozerを見ていない。したがって、必要なスキーマを取り、JAXBを使用して対応するJavaBeanクラスのセットを作成し、既存のJavaBeansからJAXB JavaBeansへのDozerマッピングを設定することができます。より多くのコードのように聞こえるだけでなく、より多くの自動化。私はCurtainDogが今何を意味するのかを見ます。 –

0

JIBXと考えることができる場合は、ドメインモデルクラスからターゲットXMLスキーマにmappingを定義することができます。

また、結合技術を使用して割り引いたと述べていますが、その決定を検討することをおすすめします。ドメインモデルから生成されたモデルにコピーすると、あなたが提案しているものよりもメンテナンスが容易でエラーの発生が少ないコード(JIBXも可能)

JIBXに関する質問は私の経験では無益ですが、そのメーリングリストは非常に参考になります。

1

スクリプト言語のビルダーほど簡潔ではありませんが、StaxMateは非常に単純です。構造的にツリーモデルと同じくらい単純ですが、型付きの追加(暗黙的な変換)もサポートします。これはすべてストリームに直接実行されます。つまり、メモリ使用量が非常に少ない(高速であれば高速です)。

流暢なスタイル(2.0.x以降)もしばしば理にかなっています。完全なデータバインディング(およびツリーモデル)ソリューションに対する主な利点は、おそらくメモリ使用量が少ないことです。状態はほとんど保持されず、すべての出力ができるだけ早く宛先に出力されます。

2

XOMをご覧ください。速く、シンプルで、正確で、冗長ではありません。

関連する問題