おそらく愚かな質問:私はXMLファイルにマーシャリングしたい<Data>
型のList
を持っています。これはDatabase
を含む私のクラスArrayList
です...
@XmlRootElement
public class Database
{
List<Data> records = new ArrayList<Data>();
public List<Data> getRecords() { return records; }
public void setRecords(List<Data> records) { this.records = records; }
}
...そしてこれはクラスDataです:
// @XmlRootElement
public class Data
{
String name;
String address;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
}
次のテストクラスの使用...
public class Test
{
public static void main(String args[]) throws Exception
{
Data data1 = new Data();
data1.setName("Peter");
data1.setAddress("Cologne");
Data data2 = new Data();
data2.setName("Mary");
data2.setAddress("Hamburg");
Database database = new Database();
database.getRecords().add(data1);
database.getRecords().add(data2);
JAXBContext context = JAXBContext.newInstance(Database.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(database, new FileWriter("test.xml"));
}
}
...私は結果を得ました:
<database>
<records>
<address>Cologne</address>
<name>Peter</name>
</records>
<records>
<address>Hamburg</address>
<name>Mary</name>
</records>
</database>
しかし、それは私が期待していたことではありません。つまり、<Data>
オブジェクトのすべてのタグが欠落しています。次の構造でデータをエクスポートする方法を探していますが、これを達成する方法がわかりません。
<database>
<records>
<data>
<address>Cologne</address>
<name>Peter</name>
</data>
<data>
<address>Hamburg</address>
<name>Mary</name>
</data>
</records>
</database>
1つの追加の質問:@XmlElementWrapper
および@XmlElement
アノテーションを使用して問題を処理する場合なし中間クラスを導入できます
public class Records
{
List<Data> data = new ArrayList<Data>();
public List<Data> getData() { return data; }
public void setData(List<Data> data) { this.data = data; }
}
変更された基本クラスによって使用されます
@XmlRootElement
public class Database
{
Records records = new Records();
public Records getRecords() { return records; }
public void setRecords(Records records) { this.records = records; }
}
わずかに変更されたTest
クラス:
...
Database database = new Database();
database.getRecords().getData().add(data1);
database.getRecords().getData().add(data2);
...
結果も次のとおりです。
<database>
<records>
<data>
<address>Cologne</address>
<name>Peter</name>
</data>
<data>
<address>Hamburg</address>
<name>Mary</name>
</data>
</records>
</database>
これは推奨上記のXMLファイル構造に従ってクラス構造を作成するJavaの方法ですか?
Recordsプロパティに追加します:
@XmlElementWrapper(name="records")
@XmlElement(name="data")
JAXBおよびコレクションプロパティの詳細については、以下を参照してください。
これは、2番目の質問に対する回答を却下したものです。
どちらのアプローチでも同じXMLが生成されます。私の推奨事項は、アプリケーションに最適なモデルを使用することです。私にとっては、一般的に@ XmlElementWrapper/@ XmlElementを使用しています。 「レコード」は「データ」要素を整理するためだけにあるため、独自のクラスに値するものではありません。
MOXy JAXB 実装を主導し、@ XmlElementWrapperで可能なことを超えるXPathベースのマッピング拡張機能を提供します。
2番目の質問に対する回答:
Is this the recommended way to create a Java class structure
according to the XML file structure above?
技術的に言えば、JAXBの問題を解決するために余分なRecords
クラスを導入することは、JAXBが必要としないため、不必要で冗長な作業です。 @XmlElementWrapper
および@XmlElement
name
プロパティは、問題を解決するために設計されています。
Blaiseの答えに対するコメントから、アンマーシャリング時にListなどの汎用クラスをどのように扱うかを説明する操作例で tutorial を維持します。