11

リストに含まれるオブジェクトのタイプに応じて、ルート リスト要素にエイリアスを設定できるようにしたいと考えています。たとえば、これは私の現在の出力です。

<list>
<coin>Gold</coin>
<coin>Silver</coin>
<coin>Bronze</coin>
</list>

そして、これは私がそれを次のように見せたいものです:

<coins>
<coin>Gold</coin>
<coin>Silver</coin>
<coin>Bronze</coin>
</coins>

すべてのリストをコインにエイリアスする必要があると言って、グローバル レベルでこれを行うことができますが、多くの異なるリストがあり、これは機能しません。これを行う方法についてのアイデアはありますか?シンプルであるべきだと思われますが、もちろんそうではありません。

編集:指定する必要があります。オブジェクトを xml にシリアル化しようとしています。Web フレームワークとして Spring 3 MVC を使用しています。

4

3 に答える 3

25

次のように、 type 属性を持つ Coin クラスがあるとします。

@XStreamAlias("coin")
public class Coin {
    String type;
}

また、Coin のリストを含む Coins クラスがあります。

@XStreamAlias("coins")
public class Coins{

    @XStreamImplicit
    List<Coin> coins = new ArrayList<Coin>();
}

注釈に注意してください。List は Implicit であり、Coins クラスは「coins」として表示されます。

出力は次のようになります。

<coins>
  <coin>
    <type>Gold</type>
  </coin>
  <coin>
    <type>Silver</type>
  </coin>
  <coin>
    <type>Bronze</type>
  </coin>
</coins>

それはあなたが求めたものと同じではありませんが、理由があります。

最初、コインには属性が 1 つしかありませんが、表示したいすべてのオブジェクトにも属性が 1 つしかないかどうかはわかりません。したがって、どのオブジェクト属性について話しているかを伝える必要があります。

Coin 属性をフィールドではなく XML 属性として表示することもできます。次のように:

@XStreamAlias("coin")
public class Coin {
    @XStreamAsAttribute
    String type;

    Coin(String type) {
        this.type = type;
    }
}

出力は次のとおりです。

<coins>
  <coin type="Gold"/>
  <coin type="Silver"/>
  <coin type="Bronze"/>
</coins>

それが役に立てば幸い。

于 2010-09-29T20:04:27.393 に答える
5

別のラッパー クラスが必要なため、これは理想的なソリューションではありませんが、次のようにすることもできます。

public class CoinResponse {

   private List<Coin> coinList;

   public CoinResponse(List<Coin> coinList) {
      this.coinList = coinList;
   }

   public List<Coin> getCoins() {
      return this.coinList;
   }
}

そして、ここに醜い部分があります:

List<Coin> coins = Arrays.asList( new Coin(), new Coin(), new Coin());
CoinResponse response = new CoinResponse(coins);

XStream xstream = new XStream();
xstream.alias( "coins", CoinResponse.class );
xstream.addImplicitCollection( CoinResponse.class, "coinList" );

System.out.println(xstream.toXML(response));

基本的に、これは Xstream に、CoinResponse を変換するときに「コイン」を使用し、リスト自体には名前をまったく使用しないように指示しています。

于 2010-09-29T19:38:52.270 に答える
4
@XStreamAlias("coins")
public class Coins {
        @XStreamImplicit(itemFieldName="coin")
        List<String> coins = new ArrayList<String>();
}
于 2012-05-04T10:55:36.947 に答える