2011-01-25 17 views
1

私は、列名と型を指定するスキーマと、行を含むvaluesタグからなる動的なxmlテーブル形式で作業しています。Javaオブジェクトを動的XMLに変換

<xs:complexType name="data"> 
    <xs:sequence> 
     <xs:element name="schema" type="schema"/> 
     <xs:element name="values" type="values"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="schema"> 
    <xs:anyAttribute/> 
</xs:complexType> 

<xs:complexType name="values"> 
    <xs:anyAttribute/> 
</xs:complexType> 

そして、それによって生成された例のxml:以下のXSDの簡易版

<data> 
    <schema firstName="string" lastName="string" age="integer"> 
    <values> 
     <value firstName="A" lastName="B" age="23"/> 
     <value firstName="C" lastName="D" age="63"/> 
     … 
    </values> 
</data> 

データがXMLを生成するためには、私たちの例では、データオブジェクトのリストから来ている:

public class Person { 
    private String firstName; 
    private String lastName; 
    private int age; 

    // getters and setters… 
} 

現在、このようなコードをクラスに追加して作成しています(xmlを生成するためにjaxbを使用しています):

private static QName FIRST_NAME = new QName("firstName"); 
private static QName LAST_NAME = new QName("lastName"); 
private static QName AGE = new QName("age"); 

private static Map<QName, String> schema; 

static { 
    schema = new HashMap<QName, String>(); 
    schema.put(FIRST_NAME, "string"); 
    schema.put(LAST_NAME, "string"); 
    schema.put(AGE, "integer"): 
} 

public Map<QName, String> asMap() { 
    Map<QName, String> map = new HashMap<QName, String>(); 
    map.put(FIRST_NAME, firstName); 
    map.put(LAST_NAME, lastName); 
    map.put(AGE, Integer.toString(age)): 
    return map; 
} 

public static Map<QName, String> getSchema() { 
    return schema; 
} 

そして、xmlを生成するために使用される各データオブジェクトに対してそれを行います。私はそれが最高の解決策だとは思わないが、これは機能する。私が見ている主な問題は、スキーマと値の間に何も関係がないことです。もしそれらの中の何かが変更された場合、もう一方を更新することを忘れないようにしなければなりません。また、これはすべてのクラスにこれを追加する少し騒々しいです。

誰かがこれを行うためにより良い(クリーナー/より一般的な)方法を提案できますか?スキーマや値マップを自動的に生成するには良い方法でしょうか?または他の提案....

(私は、クラスを変更せずに任意のJava Beanを与えられたものがあればいいかもしれませんが、必要に応じてクラスに追加/追加するのは問題ありません。 )

ありがとう

答えて

2

テーブル全体が動的であることが問題です。それは必要ですか?

解決策がない場合は、静的な表を作成してから、JAXBを使用してJava Beanにバインドすることができます。

動的である必要がある場合は、カスタムバインダーを使用してテーブルの静的インスタンスをJava Beanにリンクすることのみが可能です。つまり、firstName、lastNameおよびageを含むテーブルの静的インスタンスがある場合、そのテーブルから適切なバインディング(fi​​rstName、lastNameおよびage)を持つJava Beanを生成するカスタムバインダーを作成できます。今何を手作業でやっているのですか?このアプローチの問題は、バインディングツールを書くことです。

ただし、市販のソフトウェアを使用すると、最も簡単なのは、動的テーブルを使用せず、代わりに動的テーブルの各インスタンスにスキーマを書き込むことです。これらのスキーマのXML文書は、動的表を定義するXML文書に準拠しますが、JAXBを使用してすべてのコード生成を自動化し、JavaクラスをXML文書と同期させることができます。

+0

合意。しかし、動的な部分を行うには、最初にPOJOをマップに、次にマップからXML(またはJSONなど)にシリアル化することが可能です。これにより、問題を簡単に解決することができます。 JAXBは元(私は思う)を行うことはできませんが、Commons Bean-utilsからJacksonへの何かが動作します。 – StaxMan

関連する問題