List根元素的XStream别名

时间:2010-09-29 17:43:52

标签: java xml list alias xstream

我希望能够根据列表中包含的对象类型对根列表元素进行别名。例如,这是我目前的输出:

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

这就是我想要的样子:

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

我可以在全球范围内通过说所有列表应该别名为硬币来做到这一点,但我有很多不同的列表,这是行不通的。关于如何做到这一点的任何想法?似乎它应该很简单,但当然不是。

编辑:我应该指定,我正在尝试将对象序列化为xml。我使用Spring 3 MVC作为我的Web框架。

3 个答案:

答案 0 :(得分:23)

假设你有一个带有type属性的Coin类,如下所示:

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

你有一个Coins类来构成一个硬币列表:

@XStreamAlias("coins")
public class Coins{

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

注意注释。列表是隐含的,硬币类将显示为“硬币”。

输出将是:

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

这与你要求的不一样,但有一个原因。

首先,硬币只有一个属性,但我们不确定你想要显示的所有对象是否也只有一个属性。所以,我们需要告诉我们正在讨论哪个对象属性。

您还可以将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>

希望它有所帮助。

答案 1 :(得分: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时使用“硬币”,然后根据列表本身不使用任何名称。

答案 2 :(得分:4)

@XStreamAlias("coins")
public class Coins {
        @XStreamImplicit(itemFieldName="coin")
        List<String> coins = new ArrayList<String>();
}