質問

Javaオブジェクト階層からXMLドキュメントを構築する必要があります。 JavaクラスとXML形式の両方が修正されました。したがって、 XStream のようなXMLシリアライザーを使用することはできません。これは、Javaクラスに基づいてXML形式を作成します。同様に、 JAXB のようなJava XMLバインディングテクノロジーは、XMLスキーマからJavaクラスを作成するため機能しません[ ed:ただし、以下を参照してください]。手動でのアプローチが必要です。

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

JAXP または JDOM はより堅牢なコードにつながりますが、これらはかなり冗長です。

Groovy には、エレガントな MarkupBuilder

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 )にはさらに優れた言語がありますが、純粋なJavaを使い続けたいです。 practicalxml やJames Murtyの xmlbuilder

JavaでXMLドキュメントを構築するためのよりエレガントなアプローチは何ですか?

概要:

Jon Doeは dom4j および jdom

CurtainDogはいずれにせよJAXBの使用を推奨しましたが、jhericoはこれが適切な提案であると判断しました。Dozerを使用して、現在のJavaBeansとJAXB JavaBeansをマッピングできます。

thaggieは JIBX を推奨しており、CurtainDogとjhericoはバインディングテクノロジーが実際に実用的であることに同意しました。

StaxManは StaxMate を推奨しています。

これまで見てきた中で、practicalxmlとJames Murtyのxmlbuilderは最も簡潔なビルダーのようですが、かなり新しいものです。 JAXBなどのバインディングテクノロジーは、追加の安全性/自動化を提供するようです。主流の選択肢の中で、 dom4j はまあまあのように見えますが、それでもやや冗長です。 「流fluentなインターフェース」を提供します。 (ミューテーターは、変更されたオブジェクトへの参照を返すので、一緒にチェーンすることができます)、私はそれが好きです:

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())。

ありがとう!

PS:Stephan SchmidtはJavaで作業しました MarkupBuilder 、ただし公開していないようです。

役に立ちましたか?

解決

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

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

他のヒント

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

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

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

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

JIBX を検討できる場合がありますが、ドメインモデルクラスからターゲットXMLスキーマへのマッピング

代わりに、それが不可能な場合、バインディングテクノロジーを使用して割引をしたと述べていますが、ドメインモデルから生成されたモデルにコピーすると、よりクリーンになります。メンテナンスしやすく、提案しているコードよりもエラーが発生しにくいコード(これはJIBXでも実行できます)。

おそらく、ここでJIBXについて質問するのは無意味ですが、彼らのメーリングリストは非常に役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top