2016-06-28 6 views
0

私はJavaでXMLを扱うのが初めてですが、私が使用するサービスの1つが結果として返されます。今までは、@XmlRootElementのようなアノテーションを使用して、POJOにXMLをマッピングすることに取り組んできました。しかし、今、私は絶対にこの文書で行うには考えていますJAXBコレクションマッピング

@XmlRootElement(name="response") 
public class Response { 

    private Status status; 

    private String result; 

    public Status getStatus() { 
     return status; 
    } 

    @XmlElement(name = "status") 
    public void setStatus(Status status) { 
     this.status = status; 
    } 

    public String getResult() { 
     return result; 
    } 

    @XmlElement(name ="result") 
    public void setResult(String result) { 
     this.result = result; 
    } 
} 



@XmlRootElement(name = "status") 
public class Status { 

    private String ID; 
    private String code; 
    private String error; 

    public String getID() { 
     return ID; 
    } 

    @XmlElement(name = "ID") 
    public void setID(String ID) { 
     this.ID = ID; 
    } 

    public String getCode() { 
     return code; 
    } 

    @XmlElement(name = "code") 
    public void setCode(String code) { 
     this.code = code; 
    } 

    public String getError() { 
     return error; 
    } 

    @XmlElement(name = "error") 
    public void setError(String error) { 
     this.error = error; 
    } 
} 

しかし、今I:今まで

<?xml version="1.0" encoding="windows-1251"?> 
<response> 
    <status> 
     <code>0</code> 
    </status> 
    <result> 
     <limit>2</limit> 
     ... 

     <data> 
      <row0> 
       <ID>85427</ID> 
       <name>Default</name> 
       <siteID>40628</siteID> 
       ... some elements 
      </row0> 
     </data> 
    </result> 
</response> 

は、私はPOJOに(「データ」ノードを除く)XMLをバインドするためにこれらのクラスを使用しません要素を要素の集合としてバインドする必要があります。私は例を探し、コレクションのアイテムのルート要素を定義するために特定のタグを使用していましたが、このドキュメントではルートタグは<row0>,<row1>などとなります。

私は正しく理解すればJAXBアノテーションを使用してXMLからPOJOバインドルールを定義します。だから、このやり方でこのやりかたを解決することができますか、またはこの文書をDOMスタイルで操作する必要がありますか?あなたの<row0>,<row1>などを表し

あなたの行を作成したクラスは...、あなたが正常にそれを行うだろうようにJAXBでそれをマップ:

答えて

0

あなたはこのようなものを使用して、あなたの問題を解決することができます。

次に、XmlAdapter<List<Row>,List<Element>>を拡張するクラスを作成し、抽象メソッドmarshallとunmarshallを定義します。ここで

はあなたを助けるためにいくつかのJavadocです:

XmlAdapterの:http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

要素:http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Element.html

、データクラスを作成します。

public class Data{ 

    private List<Row> rows; 

    public List<Row> getRows() { 
     return rows; 
    } 

    @XmlAnyElement 
    @XmlJavaTypeAdapter(MyRowsAdapter.class) 
    public void setRows(List<Row> result) { 
     this.rows = rows; 
    } 

} 

その後あなたがこのマッピングを追加することができますレスポンスクラス:

private Data data; 

public Data getData() { 
    return data; 
} 

@XmlElement(name="data") 
public void setData(Data data) { 
    this.data = data; 
} 

この解決策を使用するには、<data>要素に行のような要素しか含めることができないことに注意してください。

また、あなたがあるため、互換性のない@XmlElementWrapperと@XmlJavaTypeAdapterを作るJAXBのバグのではなく、データのクラスを使用しての@XmlElementWrapper使用することはできません。https://java.net/jira/browse/JAXB-787

+0

私はあなたがお勧めするものでしたが、私のアダプタのマーシャル&アンマーシャリング方法の避難所呼び出されました。 私はマーシャル&アンマーシャルロジックを実装していないだけで、戻り値nullを書き込んだり、ブレークポイントを配置して呼び出されたことを確認したりします。 何か不足していますか? –

+0

申し訳ありませんが、私はJAXBのバグを認識していませんでした。私の答えを修正し、私の先例の答えがうまくいかなかった理由を最後に追加しました。 –

+0

[回答](http://pastebin.com/qVhMG4QB)、[データ](http://pastebin.com/ZmFGWeV6)、[アダプター]の順にアドバイスしてクラスを編集しました。 http://pastebin.com/0SzSf3wf)。データ=ヌル。私は私のアダプターでRow&Elementの汎用タイプを切り替えようとしましたが、結果はありませんでした。たぶんアダプターがまっすぐになっていませんか? Btw、私のテストでは、このコードで呼び出します:JAXB.unmarshal(new StringReader(xml)、Response.class)。それは失敗の理由でしょうか? –