67

おそらくばかげた質問: XML ファイルにマーシャリングしたいList型があります。これは、 ...を含む<Data>私のクラスですDatabaseArrayList

@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; }
}

...そしてこれはクラスデータです:

// @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>

追加の質問: 注釈を使用せに問題に対処したい場合は、中間クラスを導入できます@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 クラス構造を作成するための推奨される方法ですか?

4

3 に答える 3

110

records プロパティに次を追加します。

@XmlElementWrapper(name="records")
@XmlElement(name="data")

JAXB とコレクション プロパティの詳細については、次を参照してください。

于 2010-09-10T09:56:06.037 に答える
6

これは、2番目の質問に対する回答です。

どちらのアプローチでも同じXMLが生成されます。私の推奨は、アプリケーションに最適なモデルを使用することです。私にとって、それは一般的に@ XmlElementWrapper /@XmlElementを使用しています。「レコード」は「データ」要素を整理するためだけにあるため、実際には独自のクラスに値するものではありません。

私はMOXyJAXB実装を主導し、@XmlElementWrapperで可能な機能を超えるXPathベースのマッピング拡張機能を提供しています。

于 2010-09-10T17:15:42.357 に答える
5

2 番目の質問への回答:

Is this the recommended way to create a Java class structure
according to the XML file structure above?

技術的に言えば、RecordsJAXB の問題を解決するために追加のクラスを導入することは不要で冗長な作業です。JAXB はそれを必要としないからです。@XmlElementWrapperand@XmlElement nameプロパティは、問題を解決するために設計されています。

あなたのコメントからBlaiseの答えまで、アンマーシャリング時にリストなどのジェネリッククラスを処理する方法を説明する操作例を 含むチュートリアルを維持しています。

于 2012-08-07T17:49:37.050 に答える