我正在使用生成此类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类型可能有两个容器,一个用于猫,一个用于狗:
Run Code Online (Sandbox Code Playgroud)<farm> <cat>Garfield</cat> <cat>Arlene</cat> <cat>Nermal</cat> <dog>Odie</dog> </farm>
但是,这个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()).