1

列の名前と型を指定するスキーマと、行を含む値タグで構成される動的な xml テーブル形式を使用しています。以下の xsd の簡略版:

<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の例:

<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…
}

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

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 で機能するものがあれば、おそらく最も良いと思いますが、必要に応じてクラスを装飾/追加しても問題ありません。)

ありがとう

4

1 に答える 1

2

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

そうでない場合、静的テーブルを作成し、JAXB を使用してそれを Java Bean にバインドできるため、ソリューションは簡単です。

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

しかし、既製のソフトウェアを使用する場合、動的テーブルを使用せず、代わりに動的テーブルの各インスタンスのスキーマを作成するのが最も簡単です。これらのスキーマからの XML ドキュメントは、動的テーブルを定義するものに引き続き準拠しますが、JAXB を使用してすべてのコード生成を自動化し、Java クラスを XML ドキュメントと同期させることができます。

于 2011-01-25T21:15:28.933 に答える