Java オブジェクト階層から XML ドキュメントを作成する必要があります。Java クラスと XML 形式の両方が固定されています。したがって、XStreamのような XML シリアライザーは使用できません。これは、Java クラスに基づく XML 形式をベースにしています。同様に、JAXBのような Java XML バインディング テクノロジは、XML スキーマから Java クラスを作成するため、機能しません [編集: ただし以下を参照]。手動のアプローチが必要です。
ローテクな StringBuilder ルートは、脆弱でバグのあるコードになります (少なくとも私にとっては!)。
JAXPやJDOMなどの API を使用すると、はるかに堅牢なコードになりますが、これらは非常に冗長です。
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 を使い続けたいと思っています。practicexmlや James Murty のxmlbuilderなど、Java 用の新しい XML ビルダーがいくつかあるようです。
Java で XML ドキュメントを構築するためのより洗練されたアプローチは何ですか?
概要:
ただし、CurtainDog は JAXB を使用することを推奨しており、jherico は、これは適切な提案であると私に教えてくれました。Dozer を使用して、現在の JavaBeans と JAXB JavaBeans の間をマッピングできます。
thaggie は JIBX を推奨し、バインド技術が実際に実用的であるということで、CurtainDog と jherico に同意しました。
StaxMan はStaxMateを推奨しています。
私が調べたものの中で、practicxml と 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())。
皆さんありがとう!
PS: Stephan Schmidt は Java MarkupBuilderに取り組んでいましたが、公開していないようです。