XStream隐式集合配置问题

JW8*_*JW8 4 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>
Run Code Online (Sandbox Code Playgroud)

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

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

另一个用例是集合,数组和映射.如果某个类的字段是这些类型之一,则默认情况下,其所有元素都嵌入在表示容器对象本身的元素中.通过与配置XStream的XStream.addImplicitCollection(), XStream.addImplicitArray()以及XStream.addImplicitMap()方法,能够直接作为类的儿童和用于容器对象周围标签保持元件被省略.甚至可以为类声明多个隐式集合,数组或映射,但是必须可以区分这些元素以在反序列化时正确填充不同的容器.

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

<farm>
  <cat>Garfield</cat>
  <cat>Arlene</cat>
  <cat>Nermal</cat>
  <dog>Odie</dog>
</farm>
Run Code Online (Sandbox Code Playgroud)

但是,这个SO答案表明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"));
Run Code Online (Sandbox Code Playgroud)

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

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

Ian*_*rts 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);
Run Code Online (Sandbox Code Playgroud)

这表示将所有元素都命名addressLine为Strings,并将它们收集到addressLines集合中(即someAddress.getAddressLines()).