我正在使用生成此类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。
答案 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()
)。