私は、列名と型を指定するスキーマと、行を含む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を与えられたものがあればいいかもしれませんが、必要に応じてクラスに追加/追加するのは問題ありません。 )
ありがとう
合意。しかし、動的な部分を行うには、最初にPOJOをマップに、次にマップからXML(またはJSONなど)にシリアル化することが可能です。これにより、問題を簡単に解決することができます。 JAXBは元(私は思う)を行うことはできませんが、Commons Bean-utilsからJacksonへの何かが動作します。 – StaxMan