XStream隐式集合配置问题

时间:2012-10-01 21:29:01

标签: java xml xstream

我正在使用生成此类XML的系统:

<address>
  <addressLine>123 Main Street</addressLine>
  <addressLine>Suite 123</addressLine>
  <city>Test City</city>
  <stateOrProvince>AA</stateOrProvince>
  <postalCode>00000</postalCode>
</address>

两个addressLine元素应该是XStream隐式集合的一部分 - 我想调用getAddressLine()方法并获得List<String>输出。

我一直在使用XStream的教程,并且还没有弄清楚如何正确映射addressLine元素。 XStream's Tweaking Output tutorial中有类似的用例,但没有提供示例代码:

  

另一个用例是集合,数组和映射。如果一个班级有   字段是这些类型之一,默认情况下它的所有元素都是   嵌入在表示容器对象本身的元素中。通过   使用XStream.addImplicitCollection()配置XStream,   它是XStream.addImplicitArray()XStream.addImplicitMap()方法   可以将元素直接保留为类的子元素   省略了容器对象的周围标记。它是均匀的   可以声明多个隐式集合,数组或映射   对于一个类,但元素必须可以区分为填充   反序列化时正确使用不同的容器。

     

在以下示例中,表示服务器场的Java类型可能具有   两个容器,一个用于猫,一个用于狗:

<farm>
  <cat>Garfield</cat>
  <cat>Arlene</cat>
  <cat>Nermal</cat>
  <dog>Odie</dog>
</farm>

但是,此SO answer表示无法使用XStream场示例。

我已经尝试过这个Java代码对我的Java代码进行单元测试,但还没有运气:

XStream xstream = new XStream(new StaxDriver());        
xstream.alias("address", Address.class);
xstream.alias("addressLine", String.class);     
xstream.addImplicitCollection(Address.class, "addressLines");       

Address address = (Address) xstream.fromXML( 
    new FileInputStream("src/test/resources/addressTest.xml"));

我应该尝试其他配置更改吗?

注意:我目前正在使用XStream v1.2.2。

1 个答案:

答案 0 :(得分:10)

首先,如果可能的话,你应该升级到更新的XStream - 在2007年发布了1.2.2。但是要回答你的问题,试试:

XStream xstream = new XStream(new StaxDriver());
xstream.alias("address", Address.class);
xstream.addImplicitCollection(Address.class, "addressLines", "addressLine", String.class);

这表示将名称为addressLine的所有元素视为字符串,并将其收集到addressLines集合中(即someAddress.getAddressLines())。