21

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

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

JAXPJDOMなどの 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 ドキュメントを構築するためのより洗練されたアプローチは何ですか?

概要:

Jon Doe はdom4jjdomを提案しました。

ただし、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に取り組んでいましたが、公開していないようです。

4

6 に答える 6

10

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

Element.addElement("x").setAttribute("x", "y").xxxxx;
于 2009-06-20T03:10:58.660 に答える
2

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

于 2009-07-15T11:40:48.733 に答える
1

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

于 2009-06-20T03:19:18.207 に答える